1. 介绍

Docker 容器设计为轻量级、隔离的运行环境,非常适合部署短暂的、无状态的应用。但这也意味着,一旦容器被停止或删除,其内部文件系统和数据将随之丢失。因此,容器本质上是“临时的”。

但在某些场景下,我们确实需要保存容器的状态,比如保留临时数据、复制运行环境、调试问题等。本文将介绍两种常用的保存容器状态的方法:**docker commit** 和 **docker export**。

2. 使用 docker commit 保存容器状态为镜像

docker commit 是一个非常实用的命令,它允许我们将一个运行中的容器保存为一个新的镜像。这对于我们在容器中做了修改(如安装了软件、修改了配置等)后特别有用。

2.1 命令格式

docker commit <容器ID或名称> <镜像名称>:<标签>
  • <容器ID或名称>:运行中的容器的 ID 或名称。
  • <镜像名称>:你希望保存的新镜像名称。
  • <标签>:可选参数,通常为 latest 或版本号。

生成的新镜像基于原镜像,并包含你对容器所做的所有修改。

⚠️ 注意:

  • docker commit 不会保存挂载的 volume 中的内容(即使用 -v--mount 挂载的目录)。
  • 容器的网络配置、重启策略、CPU/内存限制等也不会被保存。

2.2 示例操作

我们以 Ubuntu 容器为例,安装 curl 后将其保存为新镜像:

# 启动一个 Ubuntu 容器并进入交互式 shell
$ docker run -it ubuntu /bin/bash

# 在容器内部安装 curl
# apt-get update && apt-get install -y curl

退出容器后,在宿主机执行:

# 将容器保存为 ubuntu-with-curl 镜像
$ docker commit 81f7bdcc6eff ubuntu-with-curl
sha256:52217d19f1b958a8a2f52f98644d187340cc363db0e22f499ac2469a68a5d78a

验证新镜像是否包含已安装的 curl

$ docker run -it ubuntu-with-curl /bin/bash
# curl --version
curl 8.5.0 (x86_64-pc-linux-gnu) ...

✅ 小贴士:你可以使用 docker push 将该镜像推送到远程仓库(如 Docker Hub)进行共享或备份。

3. 使用 docker export 导出容器为 tar 文件

有时你可能希望将整个容器的文件系统导出为一个 .tar 文件,而不是保存为镜像。这时就可以使用 docker export 命令。

3.1 命令格式

docker export <容器ID> > <文件名>.tar

⚠️ 注意:

  • docker export 只导出容器的文件系统,不包含镜像的层级结构和元数据
  • docker commit 一样,不会包含挂载的 volume 内容。

3.2 示例操作

继续使用前面的容器:

# 导出容器文件系统为 ubuntu-with-curl.tar
$ docker export 81f7bdcc6eff > ubuntu-with-curl.tar

如需重新导入该文件系统为新镜像,可使用 docker import

$ docker import ubuntu-with-curl.tar ubuntu-with-curl
sha256:41db1e00c5add5a28c50d7c16728baa7f2088dd4a087e484852f7bb3110e0cd4

⚠️ 踩坑提醒:这种方式导出的镜像没有历史记录,无法查看构建过程,也不适合用于构建生产环境镜像。

4. 总结

方法 用途 是否保留镜像层级 是否包含元数据 是否包含挂载卷
docker commit 保存容器为新镜像
docker export 导出为 tar 文件

✅ 选择建议:

  • 如果你需要复用容器环境(如调试、测试、构建新镜像),使用 docker commit
  • 如果你只是想打包整个文件系统用于备份或迁移,使用 docker export

这两种方式各有优劣,根据你的实际需求选择合适的工具。


原始标题:How To Save a Docker Container State