两组命令搬的不是同一个东西
save 与 load 操作的是镜像:产物里包含分层结构、标签与构建历史,还原后镜像 ID 与标签都不变。export 与 import 操作的是容器:导出的是容器文件系统合并后的快照,导入后生成一个单层镜像,CMD、ENV 这类运行时元数据全部丢失,启动参数必须重新指定。两者产物都是 tar 文件,但内部结构不同,互相之间无法直接导入。
基本信息
| save / load | 面向镜像,保留层、标签与历史元数据 |
|---|---|
| export / import | 面向容器,导出合并后的文件系统快照 |
| 产物格式 | 都是 tar,结构不同,不可互换 |
| 还原代价 | import 生成的镜像需要重新补齐启动参数 |
典型使用场景
- 离线分发:用 save 打包镜像搬到隔离环境导入
- 备份镜像版本:把验证过的镜像与标签整体留档
- 提取容器现状:容器内手工改过配置,用 export 把当前文件系统拿出来分析
- 制作快照:把运行中容器的文件系统固化成镜像用于追溯
- 判断该用哪组命令:先问自己操作对象是镜像还是容器
两组命令并列对比
两组命令并列对比
# 镜像搬运:保留标签与分层
docker save -o web.tar app/web:1.0
docker load -i web.tar
# 容器快照:只导出合并后的文件系统
docker export web-running -o web-rootfs.tar
cat web-rootfs.tar | docker import - app/web:snapshot
# 导入后的镜像没有 CMD 与 ENV,启动时要显式补齐
docker run -d app/web:snapshot /app/start.sh
# 核对镜像结构差异
docker image inspect app/web:snapshot --format '{{.Config.Cmd}} {{len .RootFS.Layers}}'两组命令对比
| 维度 | save / load | export / import |
|---|---|---|
| 操作对象 | 镜像 | 容器 |
| 产物内容 | 分层数据、标签与构建历史 | 合并后的文件系统快照 |
| 还原结果 | 镜像 ID 与标签不变 | 生成单层镜像,需重新指定启动参数 |
| 典型用途 | 离线分发与镜像备份 | 提取容器文件系统与制作快照 |
| 启动约定 | 完整保留 | 全部丢失,必须重新补齐 |
两者产物都是 tar,直接混用会得到格式错误或空镜像,判断标准是看操作对象而不是文件后缀。
用 import 得到的镜像做正式发布是不可行的:镜像里没有原来 Dockerfile 定义的启动命令、环境变量与工作目录。