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
。
这两种方式各有优劣,根据你的实际需求选择合适的工具。