先不挂载数据卷启动mysql容器验证基础运行,再用命名卷持久化;连接问题需调整认证插件和bind-address;自定义配置应挂载到conf.d目录而非覆盖my.cnf。

直接拉镜像启动,别急着挂载数据卷
用 docker run 启动 MySQL 容器最简方式就是拉官方镜像并跑起来,但新手常一上来就绑定宿主机目录,结果发现容器起不来——因为 MySQL 初始化时会检查数据目录权限和内容,宿主机空目录或权限不对就会卡在 mysqld: Can't read dir of '/var/lib/mysql/' 或直接退出。
推荐先不挂载,验证基础运行是否正常:
docker run --name mysql-test -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 -d mysql:8.0
等几秒后 docker logs mysql-test 看到 MySQL init process done. Ready for start up. 就说明镜像和启动逻辑没问题。
挂载数据卷时必须用命名卷,别硬绑宿主机路径
生产环境要持久化数据,但直接 -v /my/data:/var/lib/mysql 极易出问题:Linux 文件系统权限、SELinux 上下文、macOS 的文件共享限制都会让 MySQL 拒绝写入。官方文档明确建议用命名卷(named volume)。
正确做法是:
- 先创建卷:
docker volume create mysql-data - 再启动并挂载:
docker run --name mysql-prod -e MYSQL_ROOT_PASSWORD=123456 -v mysql-data:/var/lib/mysql -p 3306:3306 -d mysql:8.0 - 如需导出数据,进容器执行
mysqldump -uroot -p123456 --all-databases > /backup/all.sql,再用docker cp拷出来
连接不上?检查默认认证插件和 bind-address
MySQL 8.0 默认用 caching_sha2_password 插件,老客户端(比如某些 Python MySQLdb 驱动或 Navicat 旧版)连不上,报错 Authentication plugin 'caching_sha2_password' cannot be loaded。
解决方法有两个方向:
- 启动时指定传统插件:
-e MYSQL_DEFAULT_AUTHENTICATION_PLUGIN=mysql_native_password - 或者容器启动后进容器执行:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; FLUSH PRIVILEGES; - 另外,默认只监听
127.0.0.1,外部连不上。要允许远程连接,必须加--bind-address=0.0.0.0—— 但 Docker 容器里不能直接改 my.cnf,得用command覆盖默认启动命令:docker run ... mysql:8.0 --bind-address=0.0.0.0
想自定义配置?优先用 conf.d 目录挂载,别动主配置文件
MySQL 容器启动时会自动加载 /etc/mysql/conf.d/*.cnf,比覆盖 /etc/mysql/my.cnf 更安全、更可维护。
例如想调大最大连接数:
- 新建本地文件
mysql-custom.cnf,内容为:[mysqld]\nmax_connections = 500
- 启动时挂载:
docker run ... -v $(pwd)/mysql-custom.cnf:/etc/mysql/conf.d/custom.cnf:ro mysql:8.0 - 注意后缀必须是
.cnf,且挂载路径必须在conf.d下;如果挂成my.cnf,它会完全替代默认配置,导致字符集、日志路径等全失效
配置生效后,进容器执行 mysql -uroot -p123456 -e "SHOW VARIABLES LIKE 'max_connections';" 验证。










