mysql在Docker环境中快速部署与基础配置

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

直接拉起一个可连的 MySQL 容器

不需要构建镜像、不用改配置文件,

docker run
一条命令就能跑起来一个带密码、可远程连接的 MySQL 实例,适合开发/测试快速验证。

默认 root 密码通过
-e MYSQL_ROOT_PASSWORD=123456
设置,不设会启动失败
端口映射必须显式声明:
-p 3306:3306
,否则容器内服务无法从宿主机访问
--restart=always
避免 Docker 重启后服务掉线
首次运行会自动初始化数据目录,后续重启复用卷内容,不会重置密码或清库
docker run -d \
  --name mysql-dev \
  -e MYSQL_ROOT_PASSWORD=123456 \
  -p 3306:3306 \
  --restart=always \
  -v /data/mysql:/var/lib/mysql \
  -d mysql:8.0

连接被拒绝?检查 bind-address 和用户权限

容器内 MySQL 默认只监听

127.0.0.1
,即使端口映射了,外部客户端也会报
Connection refused
Access denied for user

MySQL 8.0+ 默认创建的
root@localhost
用户不能远程登录,必须额外授权
root@'%'
启动时加
-e MYSQL_ROOT_HOST='%'
可让初始化脚本自动创建通配符主机用户(仅限 8.0.13+)
若已启动,进容器执行
mysql -uroot -p123456 -e "CREATE USER 'root'@'%' IDENTIFIED BY '123456'; GRANT ALL ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;"
无需修改
my.cnf
中的
bind-address
—— Docker 容器默认用
0.0.0.0
监听,问题几乎全出在用户权限上

挂载配置文件导致启动失败的常见原因

想自定义

max_connections
character_set_server
?别直接挂载整个
/etc/mysql/my.cnf
,MySQL 容器启动逻辑对配置路径很敏感。

官方镜像只认
/etc/mysql/conf.d/*.cnf
/etc/mysql/mysql.conf.d/*.cnf
下的文件
挂载单个配置文件时,路径必须是
/etc/mysql/conf.d/custom.cnf
,且文件需有 Unix 换行符(Windows 编辑保存易出错)
配置项写错格式(如漏掉
[mysqld]
段)会导致容器立即退出,
docker logs mysql-dev
里会显示
unknown variable
parse error
字符集相关配置(如
collation-server=utf8mb4_unicode_ci
)必须和
init_connect
配合,否则客户端连接后仍可能用错编码
[mysqld]
max_connections = 200
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect = 'SET NAMES utf8mb4'

数据卷权限错误:container_linux.go:349: starting container process caused: chdir to cwd...no such file or directory

这个错误不是路径不存在,而是宿主机挂载点(如

/data/mysql
)权限不足,MySQL 进程(uid=999)无法写入。

不要用
chmod 777 /data/mysql
—— MySQL 容器启动时会校验目录属主,非
mysql:mysql
(即 uid=999)会拒绝启动
正确做法:宿主机上执行
sudo chown -R 999:999 /data/mysql
(注意是数字 uid,不是用户名)
如果用 Docker Compose,可在 service 下加
user: "999:999"
显式指定运行身份,避免依赖挂载点权限
首次初始化后,目录里会出现
ibdata1
mysql
等子目录,此时再改权限也无效,必须清空重来

Docker 里跑 MySQL 最容易卡在权限、用户授权、配置加载顺序这三处,问题现象相似但根因不同,查日志前先确认这三项是否都对得上。

相关推荐