必须避开MySQL 8.0默认禁用远程root登录、caching_sha2_password认证插件不兼容老客户端、不挂载数据卷导致重启丢库三大陷阱,推荐用命名卷+--restart unless-stopped+手动改认证插件或挂conf.d配置文件。

直接用 docker run 一行命令就能启动,但必须避开几个默认陷阱:MySQL 8.0 默认禁用远程 root 登录、默认认证插件不兼容老客户端、不挂载数据卷会导致重启后库全丢。下面分场景说明怎么做。
用 docker run 启动 MySQL 8.0(开发/测试最简方式)
这是最快能连上数据库的方法,适合本地调试:
-
mysql:8是当前最稳的选择——它固定指向 8.0.x 最新版,而mysql:latest已升级到 MySQL 9.x,不建议用 - 必须设置
MYSQL_ROOT_PASSWORD,否则容器启动失败并退出 - 推荐用命名卷(如
mysql8-data)而非主机路径挂载,避免权限和 SELinux 问题 - 加
--restart unless-stopped,防止 Docker 重启后服务掉线
执行这行命令即可:
docker run -d \ --name mysql8 \ -e MYSQL_ROOT_PASSWORD=Root@2026strong \ -p 3306:3306 \ -v mysql8-data:/var/lib/mysql \ --restart unless-stopped \ mysql:8
为什么连不上?重点检查 default_authentication_plugin
启动后用客户端连接报 Authentication plugin 'caching_sha2_password' cannot be loaded?这是 MySQL 8.0 默认插件导致的兼容性问题。
- 根本原因是 MySQL 8.0 默认用
caching_sha2_password,但很多旧版客户端(如 Navicat 15、某些 Python MySQL 驱动)不支持 - 解决办法不是降级 MySQL,而是让 root 用户改用
mysql_native_password - 不能靠环境变量一次性设好,得进容器手动改:先
docker exec -it mysql8 mysql -uroot -p,再执行
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@2026strong';
如果还没开远程访问,顺手补一句:CREATE USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'Root@2026strong'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; FLUSH PRIVILEGES;
挂载自定义配置文件(生产必备)
纯靠环境变量只能设基础参数,要调 innodb_buffer_pool_size、max_connections 或改字符集,必须挂配置文件。
- 不要覆盖
/etc/mysql/my.cnf,而是挂到/etc/mysql/conf.d/目录下,MySQL 会自动加载.cnf结尾的文件 - 文件内容必须是完整段落,比如
[mysqld]开头,否则启动失败 - 注意文件权限:宿主机上该文件需对 UID 999(MySQL 容器内用户)可读,Linux 下可
chown 999:999 my.cnf
示例 my.cnf 内容:
[mysqld] default_authentication_plugin=mysql_native_password character-set-server=utf8mb4 collation-server=utf8mb4_unicode_ci innodb_buffer_pool_size=1G max_connections=200
启动时加这一项:-v /path/to/my.cnf:/etc/mysql/conf.d/my.cnf
数据卷权限和 SELinux 常见卡点
启动后日志里反复出现 Can't start server : Bind on unix socket 或 Permission denied?大概率是数据卷权限没对。
- 用命名卷(
docker volume create mysql8-data)基本不会出权限问题,Docker 自动处理 - 若坚持用绑定挂载(
-v /host/path:/var/lib/mysql),Linux 主机上必须确保该目录属主是 UID 999,或加--user 999:999启动容器 - SELinux 启用时(如 CentOS/RHEL),要在挂载路径后加
:z标签,例如-v /data/mysql:/var/lib/mysql:z - Windows/macOS 上用 Docker Desktop 不受此限,但 WSL2 子系统里仍要当心
最省事的解法:别用绑定挂载,就用命名卷 + 定期 docker exec 备份。


















