不能直接docker run mysql:8.0完事,因MySQL 8.0强制要求显式设MYSQL_ROOT_PASSWORD(弱密码如12345678会被拒绝)、必须-p映射端口、默认caching_sha2_password插件导致旧客户端连不上,且不挂载数据卷或设--restart则容器删除或宿主机重启后服务即丢失。

直接用 docker run 一行命令就能拉起可用的 MySQL 8.0 容器,但跳过数据持久化、密码强度校验或端口冲突检查,5分钟后你就得重来。
为什么不能直接 docker run mysql:8.0 就完事
MySQL 8.0 默认启用 mysql_native_password 以外的身份验证插件(caching_sha2_password),很多老客户端(比如 Navicat 旧版、某些 Python MySQL 驱动)连不上,报错 Authentication plugin 'caching_sha2_password' cannot be loaded。另外,不挂载数据目录,容器一删,库表全丢;不设 --restart unless-stopped,宿主机重启后服务就挂了。
- 必须通过
-e MYSQL_ROOT_PASSWORD=...显式指定密码,空值或弱密码会触发 MySQL 启动失败(日志里出现ERROR 1045 (28000)) - 默认监听
127.0.0.1,不加-p 3306:3306或映射到其他端口,宿主机根本连不到 -
mysql:latest在 2026 年已指向 MySQL 9.x,务必用mysql:8或mysql:8.0.42(当前最新 patch)
推荐的单命令启动方式(开发环境够用)
这条命令覆盖了密码、端口、数据卷、自启策略和认证插件兼容性:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
docker run -d \ --name mysql8 \ -e MYSQL_ROOT_PASSWORD=Dev@2026Pass \ -e MYSQL_DATABASE=devdb \ -e MYSQL_USER=devuser \ -e MYSQL_PASSWORD=DevUser@2026 \ -p 3306:3306 \ -v mysql8-data:/var/lib/mysql \ --restart unless-stopped \ -d mysql:8
-
mysql8-data是命名卷,Docker 自动管理路径和权限,比绑定挂载/path/to/data更少遇到Permission denied - 没显式指定
default_authentication_plugin?没关系——MySQL 8.0.4+ 镜像默认已将mysql_native_password设为 fallback,客户端能自动降级协商 - 如果本地 3306 已被占用,把
-p 3306:3306改成-p 13306:3306,应用连localhost:13306即可
连不上?先查这三件事
执行 docker logs mysql8,重点看前三十行:
- 出现
mysqld: Can't read dir of '/etc/mysql/conf.d/'?说明你误挂了空配置目录,删掉-v里那条再试 - 看到
Access denied for user 'root'@'172.17.0.1'?不是密码错,是客户端没走 TCP 连接——确认连接串用的是host=localhost(不是127.0.0.1),或者加?allowPublicKeyRetrieval=true&useSSL=false - 容器状态是
Exited (1)?大概率是MYSQL_ROOT_PASSWORD不符合复杂度要求:必须 ≥8 位,含大小写字母+数字+特殊字符,12345678会被拒绝
真正容易被忽略的点是:开发环境里很多人顺手用 docker-compose.yml 启动,但忘记在 environment 下写全 MYSQL_* 变量,导致容器起来后 root 密码为空,而 MySQL 8.0 空密码是不允许登录的——这种问题不会报错,只会让你卡在登录界面反复输错。

















