docker镜像导入(load和import的区别)
如果将 docker import
和 docker save
(对应 docker load
)生成的镜像包解压对比,两者的目录结构和内容会有显著差异。以下是详细对比:
1. docker import
生成的镜像包解压后
假设通过 docker import
从文件系统归档(如 rootfs.tar
)创建镜像,解压后的内容如下:
示例命令生成镜像包
# 生成一个文件系统归档(如 rootfs.tar)
tar -cf rootfs.tar /path/to/filesystem
# 通过 docker import 创建镜像
docker import rootfs.tar my-imported-image:latest
解压后的内容
- 文件结构:直接解压
rootfs.tar
后,内容是一个完整的文件系统目录,类似于操作系统的根目录:rootfs/ ├── bin/ ├── etc/ ├── usr/ ├── lib/ ├── ...(其他系统目录)
- 无 Docker 元数据:生成的镜像不包含 Docker 的层(Layer)信息、构建历史、镜像配置(如
CMD
或ENTRYPOINT
)等。
特点
- 本质是一个单层镜像,仅包含文件系统快照。
- 镜像的元数据(如默认命令、环境变量等)需要在
docker import
时手动指定(通过--change
选项),否则为空。
2. docker save
生成的镜像包解压后
假设通过 docker save
导出镜像(如 my-image.tar
),解压后的内容如下:
示例命令生成镜像包
# 导出镜像
docker save -o my-image.tar my-image:latest
解压后的内容
解压 my-image.tar
后,会得到以下结构:
my-image/
├── manifest.json # 镜像的元数据清单(包含层和配置文件的映射关系)
├── repositories # 镜像的仓库和标签信息
├── <layer-id1>.tar # 镜像的每一层文件系统变更(可能有多个层)
├── <layer-id2>.tar
├── ...
└── config.json # 镜像的详细配置(如 ENV、CMD、ENTRYPOINT 等)
详细说明
-
manifest.json
:- 描述镜像的组成,例如:
[ { "Config": "config.json", "RepoTags": ["my-image:latest"], "Layers": ["layer1.tar", "layer2.tar"] } ]
- 描述镜像的组成,例如:
-
repositories
:- 记录镜像的仓库和标签信息,例如:
{ "my-image": { "latest": "<image-id>" } }
- 记录镜像的仓库和标签信息,例如:
-
层文件(如
layer1.tar
):- 每个层对应一个文件系统的变更(增删改文件)。
- 解压单个层文件后,会看到类似
bin/
,usr/
的目录结构,但仅包含该层的变更内容。
-
config.json
:- 包含镜像的完整配置,例如:
{ "architecture": "amd64", "config": { "Env": ["PATH=/usr/local/sbin"], "Cmd": ["/bin/bash"] }, "rootfs": { "type": "layers", "diff_ids": ["sha256:...", "sha256:..."] } }
- 包含镜像的完整配置,例如:
特点
- 镜像由多层(Layer)组成,每层对应一个
.tar
文件。 - 包含完整的 Docker 元数据(构建历史、配置、层关系等)。
3. 对比总结
特性 | docker import 的包 |
docker save 的包 |
---|---|---|
内容本质 | 单层文件系统快照 | 多层镜像(包含所有层和元数据) |
元数据 | 无 Docker 配置(需手动指定) | 包含完整的镜像配置(CMD、ENV 等) |
层信息 | 单层 | 多层(每层对应一个 .tar 文件) |
用途 | 从文件系统创建镜像 | 分发、备份完整的 Docker 镜像 |
可维护性 | 无法追溯构建历史 | 保留完整的构建历史和层信息 |
4. 实验验证
步骤 1:解压 docker import
的包
mkdir imported-image && cd imported-image
tar -xf ../rootfs.tar
# 查看内容
ls -l
# 结果:直接看到文件系统的根目录结构(如 bin/, etc/)
步骤 2:解压 docker save
的包
mkdir saved-image && cd saved-image
tar -xf ../my-image.tar
# 查看内容
ls -l
# 结果:看到 manifest.json、repositories 和多个层文件(layer1.tar, layer2.tar)
5. 关键结论
docker import
的包:适合从现有文件系统创建镜像,但缺乏 Docker 的层管理和元数据。docker save
的包:保留完整的 Docker 镜像结构,适合迁移和备份。
两者不可互换:
- 若尝试用
docker load
加载docker import
生成的包,会报错(因为缺少元数据)。 - 若尝试用
docker import
加载docker save
生成的包,会得到一个单层镜像(丢失分层信息)。
- 上一篇: Ubuntu22.04搭建k8s
- 下一篇: 没有了