直接拉镜像启动虽简但不适用于生产,必须挂载数据卷(/var/lib/mysql)和配置目录(/etc/mysql/conf.d),并设置MYSQL_ROOT_PASSWORD;推荐宿主机创建/data/mysql/{conf,data,logs}目录,自定义my.cnf配置字符集、日志等,启动时通过-v挂载。

直接拉镜像启动是最简方式,但默认配置不适用于生产
官方 mysql 镜像开箱即用,docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql:8.0 就能跑起来。但这样启动的容器:没有持久化数据、root 只允许本地连接、字符集是 utf8mb4_0900_ai_ci(可能和老应用不兼容)、日志不落盘、无法自定义 my.cnf。实际部署必须挂载配置和数据卷。
必须挂载 /var/lib/mysql 和 /etc/mysql/conf.d/
数据目录不挂载,容器重启后库表全丢;配置不挂载,无法调整 max_connections、wait_timeout 或切换字符集。推荐结构:
- 宿主机建目录:
mkdir -p /data/mysql/{conf,data,logs} - 写自定义配置到
/data/mysql/conf/my.cnf,内容至少包含:[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci skip-character-set-client-handshake log-error=/var/log/mysql/error.log
- 启动命令加两个
-v:-v /data/mysql/conf:/etc/mysql/conf.d -v /data/mysql/data:/var/lib/mysql
MYSQL_ROOT_PASSWORD 是唯一必需环境变量,其他可选但建议设
不设 MYSQL_ROOT_PASSWORD 容器会启动失败。其余常见变量作用如下:
-
MYSQL_DATABASE:启动时自动创建数据库(仅首次生效) -
MYSQL_USER+MYSQL_PASSWORD:自动建普通用户并授权(同样只在空数据目录时执行) -
MYSQL_ALLOW_EMPTY_PASSWORD=yes:危险!仅测试用,跳过密码校验 -
MYSQL_INITDB_SKIP_TZINFO=1:避免因宿主机时区缺失导致初始化卡住
连接不上?重点检查三个地方
常见报错如 Access denied for user 'root'@'172.17.0.1' 或 Can't connect to MySQL server,优先排查:
- 容器是否真在运行:
docker ps | grep mysql,别只看run命令返回就以为成功 -
端口映射是否冲突:
netstat -tuln | grep :3306,宿主机 3306 被占会导致容器监听失败,错误日志里会出现Can't start server: Bind on TCP/IP port - root 连接权限:MySQL 8.0 默认
root只允许localhost连,远程连要用mysql -h 127.0.0.1 -P 3306 -u root -p(走 TCP),或进容器执行ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
配置文件加载是否生效,最简单验证法:进容器执行 mysql -uroot -p -e "SHOW VARIABLES LIKE 'character_set%';",看输出是否匹配你写的 my.cnf。










