docker save 导出的是含分层结构、manifest.json、repositories 和 config 文件的完整镜像快照,支持跨环境还原;而 docker export 仅输出容器文件系统扁平化 tar,丢失所有镜像元数据与分层信息。

导出 Docker 镜像为 tar 包,本质是将镜像的分层文件系统(Layered FS)及其元数据按 OCI 或 Docker 自有格式序列化打包。这不是简单压缩,而是对镜像存储结构的一次“快照式固化”。
tar 包内部目录结构与核心文件
使用 docker save -o alpine.tar alpine:latest 导出后,解压 tar 包可见典型结构:
-
manifest.json:关键元数据文件,声明镜像包含哪些 layer、config 文件路径、以及顶层镜像的配置文件(如
8a25b1e0c74f.../json)和启动层顺序; -
repositories:记录镜像名称与 tag 到具体镜像 ID 的映射(如
{"alpine":{"latest":"8a25b1e0c74f..."}}),用于docker load时恢复 tag; -
各 layer 目录(如
8a25b1e0c74f.../layer.tar):每个对应一个只读层,内容为该层的完整 rootfs 差分归档(不含上层文件),采用标准 tar 格式,可直接解压查看; -
各 config 文件(如
8a25b1e0c74f.../json):描述该镜像层的构建信息(作者、创建时间、环境变量、CMD、ENTRYPOINT、历史记录等),符合 OCI Image Spec 的 image configuration 格式。
layer.tar 的真实内容与差分逻辑
每个 layer.tar 并非全量文件系统,而是基于前一层的 增量变更集。Docker 使用 AUFS/OverlayFS 等驱动时,实际存储的就是这种差分 tar:
- 新增文件 → 直接打包进 layer.tar;
- 修改文件 → 旧版本在下层,新版本在当前层,layer.tar 中仅含新版本;
- 删除文件 → 以
.wh.<filename></filename>白名单形式存在(OverlayFS),表示该文件在上层被移除; - 重命名或权限变更 → 视为修改,体现为新文件或额外的
tar元数据(如 chmod 记录)。
这意味着单独解压某一层 tar,看到的是“叠加后”的效果,但缺少上下文无法还原完整运行态文件系统。
manifest.json 如何串联多层镜像
该文件是镜像“组装说明书”。例如一个由 3 层构成的镜像,manifest.json 类似:
[{
"Config": "3a0933.../json",
"RepoTags": ["ubuntu:22.04"],
"Layers": [
"d8bb.../layer.tar",
"a1f2.../layer.tar",
"3a09.../layer.tar"
]
}]
它明确告诉 docker load:先加载第 1 层,再在其之上叠加第 2 层,最后叠加第 3 层,并用 3a09.../json 作为最终容器运行时的配置依据。没有 manifest.json,docker load 将无法识别镜像层级关系和入口配置。
与 docker export 的关键区别
docker export 针对的是 运行中容器的文件系统快照,输出单个扁平化 tar(无 layer、无 manifest、无 history),丢失所有镜像元数据和分层信息,也无法重建镜像 tag 或复用 layer 缓存;而 docker save 保留全部 OCI/Docker 镜像语义,支持跨环境完整还原镜像及所有 tag、layer、配置和构建历史。










