如果将 docker importdocker 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)信息、构建历史、镜像配置(如 CMDENTRYPOINT)等。

特点

  • 本质是一个单层镜像,仅包含文件系统快照。
  • 镜像的元数据(如默认命令、环境变量等)需要在 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 等)

详细说明

  1. manifest.json

    • 描述镜像的组成,例如:
      [
        {
          "Config": "config.json",
          "RepoTags": ["my-image:latest"],
          "Layers": ["layer1.tar", "layer2.tar"]
        }
      ]
  2. repositories

    • 记录镜像的仓库和标签信息,例如:
      { "my-image": { "latest": "<image-id>" } }
  3. 层文件(如 layer1.tar

    • 每个层对应一个文件系统的变更(增删改文件)。
    • 解压单个层文件后,会看到类似 bin/, usr/ 的目录结构,但仅包含该层的变更内容。
  4. 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 生成的包,会得到一个单层镜像(丢失分层信息)。