用 docker run 一行命令即可部署 mysql 8.0 开发环境,但必须包含 --default-authentication-plugin=mysql_native_password、-v 命名卷挂载数据、-p 暴露端口三项;否则因认证不兼容、数据丢失或网络阻断导致连不上、重启重装。

docker run 一行命令就能跑起可用的 MySQL 8.0 开发环境,但必须带上 --default-authentication-plugin=mysql_native_password、挂载数据卷、暴露端口这三项,否则连不上、数据丢、重启就重装。
为什么默认连不上?caching_sha2_password 是个坑
MySQL 8.0 默认认证插件是 caching_sha2_password,但 Navicat 15 以前、mysql-connector-python 8.0.23 之前、甚至部分 CI 脚本压根不认它,报错就是:Client does not support authentication protocol requested by server。
这不是客户端配错了,是服务端硬不兼容。必须在启动容器时强制指定:--default-authentication-plugin=mysql_native_password。
注意:MYSQL_ROOT_PASSWORD 环境变量只设密码,不改认证方式;已运行的容器也不能热更新——删掉重建最干脆。
数据怎么留得住?别用宿主机目录硬挂载
开发环境图快,但数据不能赌运气。用命名卷(named volume)比绑定挂载(bind mount)更省心:
• docker volume create mysql8-dev-data
• 启动时用 -v mysql8-dev-data:/var/lib/mysql
• 避免权限问题(不用 chown 999:999,不用管 SELinux :z 标签)
• 容器删了,数据还在,下次 docker run 复用同名卷就行
如果非要用宿主机目录(比如想直接编辑配置),确保目录属主是 UID 999:sudo chown -R 999:999 /path/to/data,且不能是 root:root 后靠 --user 强切——MySQL 初始化脚本会拒写。
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
端口通了为啥还是连不上?检查三层网络放行
-p 3306:3306 只代表 Docker 内部映射成功,不代表你能从本机或局域网连进去。断点常在:
• 宿主机防火墙:CentOS 用 sudo firewall-cmd --add-port=3306/tcp --permanent && sudo firewall-cmd --reload;Ubuntu 用 sudo ufw allow 3306
• 如果跑在云服务器上,安全组规则必须显式放行 TCP 3306 入方向(这个比本地防火墙优先级更高)
• macOS 或 Windows(WSL2)用户注意:WSL2 的 IP 是动态的,localhost:3306 通常能连,但局域网其他设备要连,得查 WSL2 的实际 IP 并用那个地址连
快速启动命令怎么写?带注释的一行够用
这是开发机上实测可用的一行命令(复制即用,密码记得换):
docker run -d \ --name mysql8-dev \ --restart unless-stopped \ -e MYSQL_ROOT_PASSWORD=devpass123 \ -e MYSQL_DATABASE=testdb \ -p 3306:3306 \ -v mysql8-dev-data:/var/lib/mysql \ --default-authentication-plugin=mysql_native_password \ mysql:8.0
说明:
•
--restart unless-stopped 让容器随 Docker 自启,开发机重启后不用手动拉•
mysql:8.0 明确锁定 8.x 系列,避开 latest 指向 MySQL 9.x 的风险• 不加
/etc/mysql/conf.d 挂载也够用,开发环境默认配置基本满足需求;真要调参数(比如 max_connections),再单独挂配置文件
真正容易被忽略的是:命名卷第一次创建时是空的,MySQL 初始化会在里面生成数据;但如果你中途改了插件参数重建容器,而复用了旧卷,初始化逻辑不会重跑——旧数据仍用老插件,新容器却按新插件去验证,结果就是连不上。这时候要么清掉卷(docker volume rm mysql8-dev-data),要么进容器手动改 root 用户认证方式(不推荐)。










