在 Docker 中部署 MySQL 8.0 时,有三大常见问题一定要提前避开,分别是:默认禁止远程 root 登录、caching_sha2_password 认证插件与旧版客户端不兼容,以及未挂载数据卷导致容器重启后数据库数据丢失。更稳妥的做法是优先使用命名卷,并配合 --restart unless-stopped 参数,同时按需手动调整认证插件,或挂载 conf.d 配置文件完成自定义设置。

使用 docker run 一条命令就可以快速启动 MySQL 8.0,但在实际使用中必须注意几个默认坑位:MySQL 8.0 默认不允许远程 root 登录、默认认证方式与部分老旧客户端不兼容,如果没有挂载数据卷,容器重建或重启后数据库内容也可能全部丢失。下面按不同场景详细说明正确做法。
用 docker run 启动 MySQL 8.0(开发/测试最简方式)
这是最快速启动并连接 MySQL 数据库的方式,尤其适合本地开发和测试环境:
mysql:8是目前更稳妥的标签选择——它通常固定指向 8.0.x 的最新版,而mysql:latest目前已经升级到 MySQL 9.x,一般不建议直接使用- 必须设置
MYSQL_ROOT_PASSWORD环境变量,否则 MySQL 容器会因为缺少 root 密码而启动失败 - 建议优先使用命名卷(例如
mysql8-data),不要直接使用主机目录挂载,这样能有效减少权限冲突和 SELinux 限制带来的问题 - 建议加上
--restart unless-stopped,避免 Docker 服务或宿主机重启后 MySQL 容器没有自动恢复运行
执行下面这条命令即可完成启动:
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
如果容器启动后,使用客户端连接 MySQL 时报错 Authentication plugin 'caching_sha2_password' cannot be loaded,通常就是 MySQL 8.0 默认认证插件引起的兼容性问题。
- 根本原因在于 MySQL 8.0 默认使用
caching_sha2_password,而很多老版本数据库客户端(如 Na vicat 15、部分 Python MySQL 驱动)并不支持该认证方式 - 解决思路不是回退 MySQL 版本,而是把 root 用户认证方式改为兼容性更好的
mysql_native_password - 这个设置不能仅靠环境变量一次性完成,通常需要进入容器手动执行:先运行
docker exec -it mysql8 mysql -uroot -p,然后再执行下面的 SQL
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;通过这组语句,可以创建名为 root、密码为 Root@2026strong 的用户,并授予其对所有数据库和数据表的完整权限,同时允许该用户从任意 IP 地址远程连接 MySQL。
挂载自定义配置文件(生产必备)
仅依赖环境变量通常只能完成基础初始化配置;如果你还需要调整 innodb_buffer_pool_size、max_connections,或者设置字符集与排序规则,就必须通过挂载配置文件来实现。
- 不要直接覆盖
/etc/mysql/my.cnf,更推荐将自定义配置挂载到/etc/mysql/conf.d/目录下,MySQL 会自动读取所有以.cnf结尾的配置文件 - 配置文件内容必须包含完整配置段,例如以
[mysqld]开头,否则 MySQL 可能无法正常启动 - 还要注意文件权限:宿主机上的配置文件需要对 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 常见卡点
如果 MySQL 启动后,日志中反复出现 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,仍然需要特别留意挂载权限
最省心、也最适合大多数用户的方案是:不要使用绑定挂载,直接采用命名卷,并结合定期执行 docker exec 进行数据库备份。
