MySQL 8.0 Docker Compose 部署图文教程

DOCKER COMPOSE · TUTORIAL 01

MySQL 8.0 Docker Compose 部署图文教程

适用服务器:(服务器IP)(CentOS 7 · 4核4G)· Docker 26.1.4 · Compose v2.27.1

0. 环境速览

本服务器实际部署

以下信息来自服务器上正在运行的 MySQL 容器(docker inspect mysql 实测),教程后面的步骤将以此配置为蓝本,密码位置已用占位符替代。

项目 实际值 说明
镜像 mysql:8.0 MySQL 官方 8.0 镜像
容器名 mysql 同网络内其他容器用此名称访问
端口映射 0.0.0.0:3306 → 3306 对外暴露,供远程/其他机器连接
数据目录 /opt/mysql/data → /var/lib/mysql bind 挂载,容器删除数据不丢
配置目录 /opt/mysql/conf → /etc/mysql/conf.d 自定义 my.cnf 片段
网络 1panel-network(172.18.0.0/16) external 网络,与其他容器互通
重启策略 unless-stopped 开机自启,手动停除外
字符集 utf8mb4 / utf8mb4_unicode_ci 中文与 emoji 安全
认证插件 mysql_native_password 兼容老客户端连接
时区 Asia/Shanghai 北京时间

1. 部署架构

docker network: 1panel-network (172.18.0.0/16, external)

mysql 容器 (mysql:8.0) 监听 3306/tcp utf8mb4 · mysql_native_password restart: unless-stopped

/opt/mysql/data → /var/lib/mysql /opt/mysql/conf → /etc/mysql/conf.d bind 挂载(数据持久化)

外部应用 / 客户端 Navicat · 应用后端 0.0.0.0:3306

wordpress halo 等容器 通过服务名访问 mysql:3306

宿主机 (服务器IP) · CentOS 7 · Docker 26.1.4 · Compose 项目目录 /opt/1panel/docker/compose/halo

架构说明:MySQL 容器只通过 3306 端口对外服务;同一 Docker 网络内的其他容器(如 WordPress)直接使用服务名 mysql 加端口 3306 连接,不需要经过宿主机 IP 绕行,速度更快也更安全。

2. 步骤一:确认 Docker 环境

STEP 1

确认 Docker 与 Compose 已安装且版本可用:

docker --version
docker compose version
# 本服务器实测:
#   Docker version 26.1.4
#   Docker Compose version v2.27.1
若提示 command not found,请先安装 Docker(CentOS 7 可参考 Docker 官方 yum 源安装),或联系服务器管理员开通权限。

3. 步骤二:规划目录与网络

STEP 2

创建数据与配置目录(目录路径可按需调整,教程沿用服务器实际路径 /opt/mysql):

sudo mkdir -p /opt/mysql/data /opt/mysql/conf
sudo chmod -R 755 /opt/mysql

关于网络:如果服务器上已存在一个供多个容器共用的外部网络(本服务器即 1Panel 创建的网络 1panel-network),直接复用它;没有则创建一个自定义网络:

# 创建自定义网络(若 1panel-network 已存在可跳过)
docker network create 1panel-network
Compose 里通过 external: true 引用已存在的网络,可避免重复创建报错;WordPress 教程将复用同一个网络,两个容器才能互相连通。

4. 步骤三:编写 docker-compose.yml

STEP 3

新建项目目录并编写 compose 文件:

sudo mkdir -p /opt/1panel/docker/compose/mysql
sudo vi /opt/1panel/docker/compose/mysql/docker-compose.yml

粘贴以下内容(密码请替换为强密码):

services:
  mysql:
    image: mysql:8.0                # MySQL 官方 8.0 镜像
    container_name: mysql           # 容器名,同网络容器用它访问
    restart: unless-stopped         # 开机自启、崩溃自动拉起
    ports:
      - "3306:3306"                 # 宿主机 3306 → 容器 3306
    volumes:
      - /opt/mysql/data:/var/lib/mysql      # 数据持久化
      - /opt/mysql/conf:/etc/mysql/conf.d   # 自定义配置目录
    environment:
      - MYSQL_ROOT_PASSWORD=你的Root强密码    # 必改
      - MYSQL_DATABASE=wordpress              # 自动创建业务库(可改为自己的库名)
      - MYSQL_USER=wordpress                  # 自动创建业务用户
      - MYSQL_PASSWORD=你的业务库密码          # 必改,WordPress 教程要用
      - TZ=Asia/Shanghai                      # 时区
    command: >
      --character-set-server=utf8mb4
      --collation-server=utf8mb4_unicode_ci
      --default-authentication-plugin=mysql_native_password
    networks:
      - 1panel-network

networks:
  1panel-network:
    external: true                  # 引用已存在的网络

关键参数说明

参数 作用
MYSQL_ROOT_PASSWORD root 超级用户密码(首次启动写入数据目录,之后修改需走 SQL)
MYSQL_DATABASE 容器首次启动时自动创建的数据库(本服务器为 wordpress 建库)
MYSQL_USER / MYSQL_PASSWORD 自动创建的普通用户及其密码,仅能访问 MYSQL_DATABASE
–character-set-server=utf8mb4 默认字符集 utf8mb4,中文与 emoji 不出现乱码
–default-authentication-plugin=mysql_native_password 兼容老版本客户端/驱动(PHP mysqli 等)的认证方式
volumes 两个目录 data 存数据文件,conf 可放入自定义 *.cnf(如改端口、优化参数)

5. 步骤四:启动服务并检查

STEP 4

cd /opt/1panel/docker/compose/mysql
docker compose up -d          # 后台启动
docker compose ps             # 查看状态,STATUS 应为 Up

首次启动会拉取镜像并初始化数据目录,稍等片刻(初始化约 10~30 秒):

docker logs mysql            # 看到 "ready for connections" 即初始化完成
docker compose logs -f mysql  # 实时跟踪日志
如果 /opt/mysql/data 目录非空(例如之前用其他方式初始化过),MySQL 可能因数据目录不一致启动失败,报 mysqld: Can't create/write to file 或认证错误。此时先备份后清空目录再启动,切勿直接删除未备份的数据。

6. 步骤五:验证数据库可用

STEP 5

6.1 容器内验证

docker exec -it mysql mysql -uroot -p
# 输入 root 密码后执行:
SHOW DATABASES;              -- 应看到 information_schema / mysql / performance_schema / sys / wordpress
USE wordpress;
SHOW TABLES;                 -- 新库应为空
exit;

6.2 宿主机 / 远程验证

# 宿主机本机测试(需已安装 mysql 客户端,或用容器内客户端代替)
mysql -h 127.0.0.1 -P 3306 -uwordpress -p wordpress

# 远程机器测试(防火墙/安全组需放行 3306)
mysql -h (服务器IP) -P 3306 -uwordpress -p wordpress
远程连接失败时按顺序排查:① 服务器防火墙是否放行 3306(CentOS 7 用 firewall-cmd --add-port=3306/tcp --permanent);② 云厂商安全组是否放行;③ docker compose ps 端口映射是否正常;④ 密码是否正确。

7. 步骤六:日常运维与备份

STEP 6

# 重启 / 停止 / 启动
docker compose restart mysql
docker compose stop mysql
docker compose start mysql

# 查看日志
docker compose logs -f mysql

# 全库备份到宿主机(推荐配合 crontab 定时执行)
docker exec mysql mysqldump -uroot -p你的Root密码 --all-databases --single-transaction > /opt/mysql/backup-$(date +%F).sql

# 恢复备份
docker exec -i mysql mysql -uroot -p你的Root密码 < /opt/mysql/backup-2026-08-30.sql
定时备份示例(每天凌晨 3 点):crontab -e 加入 0 3 * * * docker exec mysql mysqldump -uroot -p你的Root密码 --all-databases --single-transaction | gzip > /opt/mysql/backup-$(date +\%F).sql.gz(注意 % 需转义)。

8. 常见问题 FAQ

FAQ

Q1:3306 端口被占用 / 想换端口

修改 compose 中 ports 为 "13306:3306",然后 docker compose up -d 重建。同时记得同步修改 WordPress 等客户端的 DB_HOST 为 mysql:3306(容器间端口不变,仍是容器内 3306)。

Q2:忘记 root 密码

通过 docker exec -it mysql mysql -uroot -p 登录失败时,可临时跳过认证:先 docker compose stop mysql,再以 --skip-grant-tables 启动并改密;或直接重置:docker exec -it mysql mysql -uroot -p你的旧密码 -e "ALTER USER 'root'@'%' IDENTIFIED BY '新密码';"(需要能登录)。

Q3:客户端报 "Authentication plugin 'caching_sha2_password'" 或 "Unknown authentication method"

老客户端不支持 MySQL 8 默认认证,compose 里已用 --default-authentication-plugin=mysql_native_password 规避;若仍有问题,对单个用户执行 ALTER USER 'wordpress'@'%' IDENTIFIED WITH mysql_native_password BY '密码';

Q4:数据目录 /opt/mysql/data 里有什么,能直接拷走吗?

目录里是 MySQL 的物理数据文件(ibdata1、binlog 等)。停库后(docker compose stop mysql)整个目录拷走即可整体迁移;不建议在运行中直接复制。日常备份用 mysqldump 更安全。

Q5:容器时区 / 时间不对

compose 已设置 TZ=Asia/Shanghai;若容器内仍差 8 小时,检查宿主机时区 timedatectl,或给容器挂载 /etc/localtime:/etc/localtime:ro。

下一步:数据库就绪后,可按《WordPress Docker Compose 部署图文教程》在同一个 1panel-network 网络中部署 WordPress,使用 mysql 作为数据库主机名连接本数据库。
教程基于 (服务器IP) 服务器实测配置编写(Docker 26.1.4 / Compose v2.27.1 / CentOS 7)· 所有密码均为占位符,请替换为强密码
生成于 2026-08-31

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容