【Docker】一键将运行中的容器打包成镜像并导出
Docker 将启动的容器打包为镜像并导出
在日常使用 Docker 过程中,我们常常会遇到这样一个场景:
启动了一个容器,在里面做了一些环境配置、安装了依赖、调试好了应用,现在想把它的当前状态保存下来,以便以后再次使用,或者迁移到其他服务器上。
这篇文章将手把手教你如何把一个运行中的容器保存成镜像,并导出到文件。
一、背景知识
在 Docker 中,几个容易混淆的命令:
docker commit
将容器当前状态“快照”成一个新的镜像。docker save
将镜像导出成 tar 文件(保留镜像层信息和 metadata)。docker export
将容器的文件系统导出为 tar(不保留历史层和元数据)。docker load
从docker save
导出的 tar 文件导入镜像。docker import
从docker export
导出的 tar 文件创建新镜像(无历史层)。
简单理解:
保留镜像信息用
commit
+save
,只想导出文件系统就用export
。
二、操作流程
1. 启动并运行容器
例如,我们先启动一个临时容器:
docker run -it --name mycontainer ubuntu:20.04 /bin/bash
进入容器后,你可能会执行:
apt update && apt install -y vim curl
现在容器状态已经发生了变化。
2. 将容器保存为镜像
当你想保存当前容器状态时:
docker commit mycontainer myimage:latest
这里的含义是:
- 将容器
mycontainer
生成一个新镜像myimage:latest
。 - 镜像会记录当时的文件系统、环境变量等。
可以验证一下:
docker images
输出类似:
REPOSITORY TAG IMAGE ID CREATED SIZE
myimage latest a1b2c3d4e5f6 5 seconds ago 250MB
3. 导出镜像为 tar 文件
docker save -o myimage.tar myimage:latest
这样会生成一个 myimage.tar
文件,你可以发送给别人或存档。
4. 在另一台机器导入镜像
复制 myimage.tar
到另一台服务器后执行:
docker load -i myimage.tar
导入成功后:
docker images
就可以看到 myimage:latest
出现在新环境中了。
三、完整命令汇总
# 将容器保存成镜像
docker commit mycontainer myimage:latest # 将镜像导出成 tar 包
docker save -o myimage.tar myimage:latest # 传输到另一台机器
scp myimage.tar user@remote:/path # 另一台机器加载镜像
docker load -i myimage.tar
四、docker commit
vs docker export
的区别
功能 | docker commit + docker save | docker export |
---|---|---|
保留历史层 | ✅ | ❌ |
保留镜像 metadata(如 CMD、ENV) | ✅ | ❌ |
导出内容 | 镜像(包括层和配置) | 容器文件系统快照 |
导入方式 | docker load | docker import |
如果你是为了迁移或复用镜像,请选择 commit + save
;
如果只是想要容器的纯文件系统数据,才用 export
。
五、总结
通过 docker commit
和 docker save
,我们可以轻松地将运行中的容器状态保存下来并导出成镜像文件,方便在不同环境中部署。
这是在开发调试阶段、迁移环境或者快速备份时非常实用的技巧。
小建议:如果是长期维护的项目,建议将重要配置写到 Dockerfile 中,从源代码构建镜像,而不是依赖
commit
生成镜像。这样更易于版本管理和复现。
📌 参考命令速查表:
docker commit <容器名/ID> <镜像名:标签> # 保存容器为镜像
docker save -o <文件名.tar> <镜像名:标签> # 导出镜像
docker load -i <文件名.tar> # 导入镜像
docker export <容器名/ID> > <文件名.tar> # 导出容器文件系统
docker import <文件名.tar> <镜像名:标签> # 从文件系统生成镜像