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