如何通过docker搭建mysql环境_mysql容器化部署

来源:这里教程网 时间:2026-02-28 20:35:49 作者:

直接拉镜像启动是最简方式,但默认配置不适用于生产

官方

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

相关推荐