什么是容器清单?
What is a container manifest?
关于此主题的唯一 doc 似乎假设我已经知道清单是什么、它解决的问题以及它如何融入 docker 生态系统。阅读文档后,我仍然不确定清单实际上是如何工作的。
我的私人 GCR 包含清单文件 - 不太了解它们的用途。 docker hub 是否也使用清单文件?我可以看到它们包含层和每一层的哈希值,但我仍然不清楚如何 docker generates/uses 它们。
容器清单的用途是什么?
一个image
是一个JSON清单和单个层文件的组合。拉取镜像的过程以检索这两个组件为中心。因此,当您拉取图像文件时:
获取清单:
GET /v2/<name>/manifests/<reference>
当清单在手时,客户端必须验证签名以确保名称和层有效。
然后客户端将使用摘要下载各个层。图层在 V2
注册表 API 中存储为 blobs
,由它们的摘要键控。
清单类型实际上是 JSON 描述的 named/tagged 图像。此描述(清单)旨在供容器 运行 时间使用,例如 Docker 引擎。
任何声称拥有 Docker 分发 v2 API/v2.2 图像规范支持的注册表或 运行time 将与各种清单类型进行交互以找出:
- 构建容器的根文件系统需要哪些实际文件系统内容(层),以及..
- 了解如何 到运行 使用此图像的容器所需的任何特定图像配置。例如,启动容器时 运行 的命令等信息(可能在用于构建映像的
Dockerfile
中表示)。
如前所述,与注册表对话的客户端(例如 docker pull
实现)将通过 Docker v2 API 进行交互,以首先获取清单具体 image/tag 然后确定要下载什么 除了能够 运行 基于此图像的容器。 v2 清单格式没有编码到其中的签名,但是使用 notary server 等工具的外部验证可用于验证相同“blob”/内容哈希上的外部签名以获得完全加密信任。 Docker 称之为“Docker 内容信任”,但在与注册表对话时不需要它,在与图像注册表对话时它也不是 API 流程的一部分。
v2.2 规范中关于清单的一个额外细节:不仅有标准的清单类型,还有一个 清单列表 类型,它允许注册表表示支持多个单个“image:tag
”引用下的平台(CPU 或操作系统变体)。清单列表仅包含一个平台条目列表,其中包含指向现有清单的重定向器,以便引擎可以为特定 platform/architecture 组合检索正确的组件。在今天的 DockerHub 中,所有官方图像现在实际上都是清单列表,允许使用相同图像 name:tag
组合支持许多平台。我有一个工具可以查询注册表中的条目并显示它们是否是清单列表,还可以转储清单的内容——清单列表和“常规”清单。您可以在 manifest-tool GitHub repository.
阅读更多内容
来自 this talk on containerd design 的幻灯片 13 也有一个很好的图形表示,说明清单如何列出 link 到清单,它代表特定平台的图像配置和层。
关于此主题的唯一 doc 似乎假设我已经知道清单是什么、它解决的问题以及它如何融入 docker 生态系统。阅读文档后,我仍然不确定清单实际上是如何工作的。
我的私人 GCR 包含清单文件 - 不太了解它们的用途。 docker hub 是否也使用清单文件?我可以看到它们包含层和每一层的哈希值,但我仍然不清楚如何 docker generates/uses 它们。
容器清单的用途是什么?
一个image
是一个JSON清单和单个层文件的组合。拉取镜像的过程以检索这两个组件为中心。因此,当您拉取图像文件时:
获取清单:
GET /v2/<name>/manifests/<reference>
当清单在手时,客户端必须验证签名以确保名称和层有效。
然后客户端将使用摘要下载各个层。图层在
V2
注册表 API 中存储为blobs
,由它们的摘要键控。
清单类型实际上是 JSON 描述的 named/tagged 图像。此描述(清单)旨在供容器 运行 时间使用,例如 Docker 引擎。
任何声称拥有 Docker 分发 v2 API/v2.2 图像规范支持的注册表或 运行time 将与各种清单类型进行交互以找出:
- 构建容器的根文件系统需要哪些实际文件系统内容(层),以及..
- 了解如何 到运行 使用此图像的容器所需的任何特定图像配置。例如,启动容器时 运行 的命令等信息(可能在用于构建映像的
Dockerfile
中表示)。
如前所述,与注册表对话的客户端(例如 docker pull
实现)将通过 Docker v2 API 进行交互,以首先获取清单具体 image/tag 然后确定要下载什么 除了能够 运行 基于此图像的容器。 v2 清单格式没有编码到其中的签名,但是使用 notary server 等工具的外部验证可用于验证相同“blob”/内容哈希上的外部签名以获得完全加密信任。 Docker 称之为“Docker 内容信任”,但在与注册表对话时不需要它,在与图像注册表对话时它也不是 API 流程的一部分。
v2.2 规范中关于清单的一个额外细节:不仅有标准的清单类型,还有一个 清单列表 类型,它允许注册表表示支持多个单个“image:tag
”引用下的平台(CPU 或操作系统变体)。清单列表仅包含一个平台条目列表,其中包含指向现有清单的重定向器,以便引擎可以为特定 platform/architecture 组合检索正确的组件。在今天的 DockerHub 中,所有官方图像现在实际上都是清单列表,允许使用相同图像 name:tag
组合支持许多平台。我有一个工具可以查询注册表中的条目并显示它们是否是清单列表,还可以转储清单的内容——清单列表和“常规”清单。您可以在 manifest-tool GitHub repository.
来自 this talk on containerd design 的幻灯片 13 也有一个很好的图形表示,说明清单如何列出 link 到清单,它代表特定平台的图像配置和层。