必须挂载/var/lib/mysql,否则容器删除后数据全丢;推荐命名卷(如mysql8-data),由Docker自动管理路径与权限,免手动chown;绑定挂载需满足绝对路径、目录为空、属主UID 999三条件。

/var/lib/mysql必须挂载,否则容器一删,数据全丢。这是最核心的前提,没有例外。
用命名卷(推荐):简单、安全、免权限操心
命名卷由 Docker 自动管理路径和权限,适合绝大多数开发/测试场景,也适用于生产中对路径不敏感的部署。
-
docker volume create mysql8-data先创建卷 - 启动时用
-v mysql8-data:/var/lib/mysql挂载,不要写宿主机路径 - 不用手动
chown或清空目录——Docker 会自动以 UID 999 初始化数据目录 - 迁移或备份时,用
docker run --rm -v mysql8-data:/volume -v $(pwd):/backup alpine tar czf /backup/mysql-backup.tar.gz -C /volume .
用绑定挂载(宿主机目录):可控但易踩坑
当你需要直接查看、编辑、备份文件,或配合宿主机监控/备份工具时才选它。但必须严格满足三个条件:
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 宿主机路径必须是绝对路径,例如
/data/mysql,不能是./mysql或~/mysql - 该目录必须为空(首次启动前
rm -rf /data/mysql && mkdir -p /data/mysql) - 目录属主需为 UID 999:
chown -R 999:999 /data/mysql;SELinux 启用时额外加:z标签,如-v /data/mysql:/var/lib/mysql:z - 常见失败现象:
docker logs mysql8显示卡在Starting MySQL...或报错mysqld: Can't read dir of '/etc/mysql/conf.d/'——大概率是挂载点非空或权限不对
配置文件和日志要不要一起挂载?
可以,但目的不同,挂载方式也不同:
- 自定义配置:挂到
/etc/mysql/conf.d/(不是/etc/mysql/my.cnf),后缀必须是.cnf,例如-v ./my.cnf:/etc/mysql/conf.d/custom.cnf:ro;加:ro防止容器内误改 - 错误日志/慢查询日志:MySQL 8.0 默认不写文件日志,需显式配置
log_error=/var/log/mysql/error.log并挂载/var/log/mysql目录;否则日志只输出到 stdout,靠docker logs查看 - 别挂
/etc/mysql整个目录——会覆盖镜像内置的默认配置,导致初始化失败
挂载本身不难,难的是“空目录 + UID 999 + 绝对路径”这三点同时满足。很多人反复重试失败,其实就卡在其中一项被忽略。










