容器重启后数据不丢失,因其可写层绑定容器生命周期,删除或重建容器即丢失数据;必须通过volume(推荐生产环境)、bind mount(适合开发调试)或tmpfs(仅限临时敏感数据)将数据“挪出去”实现持久化,并辅以定期备份与显式卷管理。

容器重启后数据丢失,不是 Docker 有 bug,而是它本来就这样设计的——可写层绑定容器生命周期。只要容器被删、重建或异常退出,那一层就没了,数据自然消失。真正要解决的,是把关键数据“挪出去”,脱离容器本身。
用 Volume 做数据库类服务的持久化(推荐首选)
Volume 是 Docker 官方推荐、生产环境最稳妥的方式。它由 Docker 管理,路径独立、权限安全、跨平台一致,特别适合 MySQL、PostgreSQL、Redis、TiKV 等有状态服务。
- 创建命名卷:
docker volume create mysql-data - 启动容器时挂载:
docker run -d --name mydb -v mysql-data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:8.0 - 验证效果:进容器建库、插数据,然后
docker rm -f mydb再用同样命令重跑,数据还在 - 查卷位置:
docker volume inspect mysql-data,看到 Mountpoint 就是宿主机实际存储路径
用 Bind Mount 管理配置和日志(适合开发/调试)
当你需要频繁改配置文件、看日志、或者想用 IDE 直接编辑容器内代码时,绑定宿主机目录更直观。
- 挂载本地 config 目录:
docker run -d -v $(pwd)/conf:/etc/nginx/conf.d -p 80:80 nginx - 挂载日志目录便于收集:
-v /data/logs/nginx:/var/log/nginx - 注意权限:Linux 下确保宿主目录属主匹配容器用户(比如 MySQL 容器常用用户是 999),否则启动失败
- Windows/macOS 用户注意路径格式,
$(pwd)在 PowerShell 中要换成${PWD}
别把 tmpfs 当主力,只给临时敏感数据用
tmpfs 把数据存在内存里,容器一停就清空,适合 session 缓存、临时 token 或中间计算结果,但绝不能存数据库或工作流定义。
- 示例:
docker run -d --tmpfs /run/secrets:ro --tmpfs /tmp:rw,noexec nginx - 好处是快、干净、不落盘;坏处是没备份、不可恢复、重启即失
- n8n、Jenkins 这类工具的临时凭证,用 tmpfs 比放 volume 更安全
生产环境必须加的一道保险:定期备份 + 显式卷管理
Volume 虽然不随容器删,但也不是绝对保险。误删卷、磁盘损坏、升级出错都可能丢数据。真正在意业务,得有备份闭环。
- 备份脚本示例(MySQL):
docker exec mydb mysqldump -u root -p123456 --all-databases > backup_$(date +%F).sql - 备份目标建议存到远程 NAS 或对象存储(如 MinIO、S3),别只放在同一台机器上
- 用
docker volume ls定期巡检,避免大量无用卷堆积占用空间 - CI/CD 流程中,把 volume 创建和初始化逻辑写进部署脚本,而不是靠人手动操作











