docker commit是将运行中或已停止容器的文件系统变更层固化为新镜像的快照操作,支持作者、消息、环境变量等元数据注入,适用于快速调试、环境复现与教学演示,但不保存内存状态、网络连接及挂载卷数据。

docker stop 不是快照,它只是发信号终止进程,不保存任何运行时状态。真正实现“瞬间复原”的,是把容器当前完整状态固化为可复用的镜像,再配合外部数据持久化,让环境重建接近秒级。
用 docker commit 做轻量级快照
这是开发中最常用、最直接的方式。容器正在运行且配置已调好时,执行:
-
docker commit
myapp:dev-snapshot-$(date +%Y%m%d) —— 生成含当前文件系统变更(如配置修改、临时安装的包、日志清理等)的新镜像 - 后续只需 docker run -d --name myapp-restored myapp:dev-snapshot-20260414,几秒内就拉起一模一样的环境
- 注意:commit 不保存内存、网络连接或未 flush 的缓存;也不包含挂载卷里的数据——这些必须单独处理
把有状态数据从容器里“移出去”
数据库、上传目录、缓存等不能靠 commit 保存,必须外置:
- 用 volume 或 bind mount 挂载 Redis / PostgreSQL 数据目录、应用日志路径、用户上传文件夹
- 备份时单独 tar 打包这些挂载点目录,例如:tar -cf pg_data_backup.tar /var/lib/postgresql/data
- 恢复时先重建 volume,再把备份数据解压进去,最后用快照镜像启动容器——状态就完整了
搭配 docker-compose 实现一键复原
把容器配置、网络、挂载、环境变量全部声明在 docker-compose.yml 中:
- 每次 commit 新镜像后,更新 compose 文件里的 image 字段,比如 image: myapp:dev-snapshot-20260414
- 运行 docker-compose down && docker-compose up -d,就能按声明重建整个服务栈,包括网络、依赖顺序、端口映射等
- 建议将 compose 文件和镜像备份一起归档,避免配置漂移
慎用 docker export / import
export 导出的是容器文件系统快照(不含元数据和历史层),import 后生成的是新镜像,但会丢失以下关键信息:
- 原始镜像的构建历史、LABEL、ENV 和 HEALTHCHECK 等配置
- 无法分层复用,体积更大,后续 diff 更新效率低
- 不适合需要持续迭代的开发环境——commit 更贴近 Git 思维,支持多版本并行与回溯











