直接拉镜像启动是最简方式,但默认配置不适用于生产
官方
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 portroot 连接权限: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。
