mysql容器数据持久化必须使用命名卷或绑定挂载;推荐用docker volume create创建命名卷并挂载至/var/lib/mysql,可确保容器删除后数据不丢失。

MySQL 在 Docker 中运行时,默认容器删除后数据会丢失,必须通过数据卷(Volume)或绑定挂载(Bind Mount)实现持久化。最推荐的方式是使用 Docker 管理的命名卷(Named Volume),它由 Docker 自动管理路径、权限和生命周期,安全且易用。
创建并使用命名卷启动 MySQL 容器
命名卷是 Docker 官方推荐的数据持久化方式,适合生产与开发环境:
- 执行
docker volume create mysql_data创建一个名为mysql_data的卷 - 启动容器时通过
-v mysql_data:/var/lib/mysql将其挂载到 MySQL 默认数据目录 - 完整命令示例:
docker run -d --name mysql-prod -e MYSQL_ROOT_PASSWORD=123456 -v mysql_data:/var/lib/mysql -p 3306:3306 -d mysql:8.0 - 该卷独立于容器存在,即使删掉容器甚至重装镜像,数据仍保留
验证数据是否真正持久化
不能只看容器是否启动成功,要实际验证写入的数据能否跨容器保留:
- 进入容器:
docker exec -it mysql-prod mysql -uroot -p123456 - 创建数据库、表并插入测试数据,例如:
CREATE DATABASE testdb; USE testdb; CREATE TABLE t1(id INT); INSERT INTO t1 VALUES(1); - 停止并删除容器:
docker stop mysql-prod && docker rm mysql-prod - 用相同卷重新运行容器,再次连接 MySQL,检查
testdb和t1是否仍在
绑定挂载(Host Bind Mount)的适用场景与风险
将宿主机目录(如 /mydata/mysql)直接挂载进容器,适合调试或需要直接访问文件的场景,但要注意:
- 宿主机目录需提前创建,并确保属主为
999:999(MySQL 容器内默认用户 mysql 的 UID/GID)
示例:sudo mkdir -p /mydata/mysql && sudo chown -R 999:999 /mydata/mysql - 不同系统(如 macOS/Windows)的文件系统行为差异可能导致性能下降或权限异常
- 不建议在生产环境直接用绑定挂载替代命名卷,除非有明确运维需求(如备份脚本依赖固定路径)
备份与迁移数据卷的实用方法
命名卷本身不可直接拷贝,需借助容器临时挂载完成导出:
- 备份:运行一次性容器挂载该卷和宿主机目标路径,用
mysqldump导出docker run --rm -v mysql_data:/var/lib/mysql -v $(pwd):/backup mysql:8.0 bash -c 'mysqldump -u root -p123456 --all-databases > /backup/full_backup.sql' - 恢复:先创建新卷,再用类似方式导入 SQL 文件
- 也可用
docker volume inspect mysql_data查看卷物理路径(仅限 Linux),但不建议直接操作底层文件
不复杂但容易忽略的是权限和挂载路径的匹配。只要卷名正确、挂载点是 /var/lib/mysql、MySQL 进程能正常写入,数据就能可靠留存。










