MySQL 8.0 Docker Compose 部署图文教程
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. 部署架构
3306 端口对外服务;同一 Docker 网络内的其他容器(如 WordPress)直接使用服务名 mysql 加端口 3306 连接,不需要经过宿主机 IP 绕行,速度更快也更安全。
2. 步骤一:确认 Docker 环境
确认 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. 步骤二:规划目录与网络
创建数据与配置目录(目录路径可按需调整,教程沿用服务器实际路径 /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
external: true 引用已存在的网络,可避免重复创建报错;WordPress 教程将复用同一个网络,两个容器才能互相连通。4. 步骤三:编写 docker-compose.yml
新建项目目录并编写 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. 步骤四:启动服务并检查
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. 步骤五:验证数据库可用
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
firewall-cmd --add-port=3306/tcp --permanent);② 云厂商安全组是否放行;③ docker compose ps 端口映射是否正常;④ 密码是否正确。7. 步骤六:日常运维与备份
# 重启 / 停止 / 启动
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
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
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。
1panel-network 网络中部署 WordPress,使用 mysql 作为数据库主机名连接本数据库。



暂无评论内容