docker save/load 和 docker export/import 是 Docker 处理镜像 / 容器打包的两组核心命令,
核心区别在于操作对象、打包内容、是否保留分层 / 元数据
一、核心区别总表
| 维度 | docker save/load | docker export/import |
|---|---|---|
| 操作对象 | 镜像(Image) | 容器(Container,需是停止 / 运行态) |
| 打包内容 | 包含镜像所有分层、元数据 (标签、构建信息) | 仅容器的 "当前文件系统快照" (扁平化,无分层) |
| 是否保留历史 | 保留镜像分层和构建历史,可复用缓存 | 无分层、无历史,导入后是单一新镜像层 |
| 是否保留标签 | 保存 / 加载时保留镜像标签(如 nginx:1.24) |
导入时默认无标签,需手动指定 |
| 命令格式 | save:docker save -o 文件名.tar 镜像名 load:docker load -i 文件名.tar |
export:docker export -o 文件名.tar 容器ID import:docker import 文件名.tar 新镜像名:标签 |
二、通俗理解 + 使用场景
1. docker save/load(镜像打包)
-
通俗理解:把 "多层汉堡" 完整打包,包括每一层食材和汉堡的标签(如 "香辣鸡腿堡"),解压后还是原来的多层汉堡。
-
适用场景:
-
✅ 备份 / 迁移完整镜像(含分层、标签);
-
✅ 分享官方镜像 / 自定义构建的镜像(保留所有信息);
-
✅ 批量导出多个镜像(如
docker save -o all.tar nginx:alpine mysql:8)。 -
示例 :
# 保存nginx:alpine镜像为nginx.tar docker save -o nginx.tar nginx:alpine # 加载镜像(保留标签nginx:alpine) docker load -i nginx.tar
2. docker export/import(容器打包)
-
通俗理解:把 "做好的汉堡(容器)" 压成扁平的肉饼,只保留最终的样子,看不到分层,也没有原来的标签。
-
适用场景:
-
✅ 备份容器的当前状态(如容器内已配置好的环境、数据);
-
✅ 把运行中的容器转为镜像(但丢失分层和元数据);
-
❌ 不适合迁移官方镜像 / 需复用分层的场景。
-
示例 :
# 导出运行中的nginx容器(ID为abc123)为nginx-container.tar docker export -o nginx-container.tar abc123 # 导入为新镜像(需手动加标签) docker import nginx-container.tar my-nginx:v1
三、关键避坑点
- load 不能改镜像名,import 必须指定新镜像名 :
docker load会还原镜像的原始名称和标签,无法在加载时修改;docker import导入的是 "扁平快照",必须手动指定新镜像名:标签,否则镜像无名称(显示<none>:<none>)。
- export 会丢失卷数据:容器挂载的卷(Volume)数据不在 export 范围内,仅打包容器内置文件系统。
- save 支持多镜像打包,export 仅支持单个容器 :
docker save可同时打包多个镜像到一个 tar 包,docker export只能导出一个容器。
总结:选型原则
- 要完整保留镜像信息(分层、标签、历史) → 用
save/load; - 只需要容器当前的文件系统快照 (如备份容器状态、简化镜像)→ 用
export/import。