必须挂载/var/lib/mysql目录实现持久化,推荐命名卷(docker volume create mysql_data && -v mysql_data:/var/lib/mysql);若用宿主机目录,需mkdir -p /data/mysql && chown -R 999:999 /data/mysql;必设MYSQL_ROOT_PASSWORD且符合8位以上复杂度要求。

docker run 是最直接的方式,但不加数据卷挂载就启动 MySQL 容器,等于把数据库建在临时文件系统上——容器一删,数据全丢。这不是部署,是玩火。
必须用 -v 挂载数据目录,且路径要对
MySQL 8.0 官方镜像默认把数据存在 /var/lib/mysql,宿主机上必须挂载一个真实目录或命名卷到这个路径:
- 推荐用命名卷(安全、免权限麻烦):docker volume create mysql_data,然后 -v mysql_data:/var/lib/mysql
- 若用主机目录,务必提前创建并赋权:mkdir -p /data/mysql && chown -R 999:999 /data/mysql(因为 MySQL 容器内用 UID 999 运行 mysqld)
- 切忌写成 -v /data/mysql:/tmp/mysql 这类错位路径,容器会静默初始化空库,你根本看不到报错
MYSQL_ROOT_PASSWORD 是唯一必填环境变量
没有它,容器启动失败,日志里只有一行:Error: Database is uninitialized and password option is not specified
- 密码必须满足 MySQL 8.0 默认策略:至少 8 位,含大小写字母、数字、特殊字符(如 YourPassw0rd!)
- 其他变量如 MYSQL_DATABASE、MYSQL_USER 都是可选的,不填也完全能连进去手动建库建用户
- 不要用 MYSQL_ALLOW_EMPTY_PASSWORD=yes,这会绕过密码强制策略,测试可以,但任何接近生产的场景都该禁用
端口、重启策略和配置文件这些细节决定能不能长期用
--p 3306:3306 要写全,别只写 -p 3306,否则只映射到随机端口,连都连不上
- 加上 --restart unless-stopped,否则宿主机重启后 MySQL 不自动起来
- 自定义配置(比如改字符集、调 innodb_buffer_pool_size)必须挂载到 /etc/mysql/conf.d/ 下,且文件名以 .cnf 结尾,否则 MySQL 启动时直接忽略
- 镜像默认用 caching_sha2_password 插件,老客户端连不上就加一行:default_authentication_plugin=mysql_native_password挂载不是加个 -v 就完事。真正容易被忽略的是:宿主机目录权限是否匹配容器内 MySQL 进程 UID,以及挂载路径是否精确对应容器内数据目录。这两点出错,容器要么起不来,要么起来后数据实际没落盘。


















