Docker manifest
mediaType
在下面后面的文章中需要注意到mediaType
对应的值,其代表了文件的类型,在规范中定义了以下类型:
application/vnd.docker.distribution.manifest.v1+json
: 代表了第一个版本的manifest格式,已经出现了第二个版本了(schemaVersion = 1)application/vnd.docker.distribution.manifest.v2+json
: 代表了新版本的manifest格式 (schemaVersion = 2)application/vnd.docker.distribution.manifest.list.v2+json
: Manifest list,也就是上方示例的manifest list文件application/vnd.docker.container.image.v1+json
: Container config JSONapplication/vnd.docker.image.rootfs.diff.tar.gzip
: “Layer”, as a gzipped tar,代表了镜像层的压缩类型application/vnd.docker.image.rootfs.foreign.diff.tar.gzip
: “Layer”, as a gzipped tar that should never be pushed,application/vnd.docker.plugin.v1+json
: Plugin config JSON
Image Manifest
Image Manifest提供了容器镜像的配置和镜像层的信息:
1 | { |
说明:
config
:包含了镜像配置信息mediaType
: 其代表了文件的类型,详情看上方的mediaTypesize
:对象的字节大小。存在此字段,以便客户端在验证之前具有预期的内容大小。如果检索到的内容的长度与指定的长度不匹配,则不应信任该内容。digest
:代表了一个文件的sha256的哈希校验值。其实就是对一个HTTP请求的返回结果进行sha256。
layers
: 包含了所有所有镜像层mediaType
:引用对象的MIME类型。通常应该是application/vnd.docker.image.rootfs.diff.tar.gzip
size
:对象的字节大小。存在此字段,以便客户端在验证之前具有预期的内容大小。如果检索到的内容的长度与指定的长度不匹配,则不应信任该内容。digest
:代表了镜像层的sha256的哈希校验值。在下面的演示中可以明确的看到
Manifest List
我们都知道镜像有amd64
、arm
、ppc64le
等架构的镜像,而且还会区分操作系统,但是我们在拉去镜像的时候并没有标明拉去amd64
还是arm64
的已经linux
,这就是靠manifest list文件来实现的。
在我们拉去镜像的时候,docker引擎会先去获取Manifest List文件,查看有没有符合CPU架构和OS等要求的镜像,然后拉去相应的镜像。
Ubuntu
镜像的manifest list
文件:
1 | { |
在上方示例中,manifests列表中所有子项都代表了一个不同架构的镜像,每个镜像对应了上面讲的Image Manifest
platform
描述了清单中的图像所运行的平台。有效的操作系统。
其他选项说明:
digest
:代表了一个文件的sha256的哈希校验值。其实该值对应的就是上方说的Image Manifest
整个文件的校验值。size
:对象字节大小,以便客户端在验证之前有一个预期的大小。platform->architecture
:描述了该镜像的CPU架构。platform->os
:描述了该镜像的操作系统。
建议去下面的官网参考链接简单的过一下。
参考:
拉取镜像的全部步骤
下面的例子以ubuntu:latest的镜像来演示
访问docker的公共仓库,会返回401认证错误,Www-Authenticate
头会返回一个获取token的地址realm
,已经service
的字符串为registry.docker.io
1 | # curl -i https://registry-1.docker.io/v2/ |
访问上一步请求的realm地址,构造一个URL<realm>?service=<service>&scope=repository:library/ubuntu:pull
<realm>
替换为上个请求Www-Authenticate
返回的realm的值<service>
替换为上个请求Www-Authenticate
返回的service的值repository:
后面替换为 镜像的仓库/镜像名称:pull
下面的操作以library/ubuntu:latest
为例
1 | # curl 'https://auth.docker.io/token?service=registry.docker.io&scope=repository:library/ubuntu:pull' |
可以看到上面返回一大串json格式的字符出,只需要保留token对应的值即可,下面的所有请求都要在请求头中带上token
对应的值
下面开始获取Manifest List文件
其实在操作时这一步是可以省略的,但是为了更好的理解对应关系,建议还是看下比较好!
获取Manifest List文件需要在Accept中设置mediaType,正是上面提过的mediaType,需要设置为application/vnd.docker.distribution.manifest.list.v2+json
1 | # head_auth="Authorization: Bearer ${TOKEN}" # 注意替换TOKEN的内容 |
注意:为了方便观看,上方返回的json我做了格式化处理。
说明:
- 上方URL中的
library/ubuntu
替换为你的镜像仓库和镜像名称。 - 上方URL中的
latest
为镜像的tag,替换成相应的即可。 - 返回结果的Header中的
Docker-Content-Digest
,正是ubuntu:latest的Digest的值,那么这个值是从哪来的呢?正是本次请求返回内容的sha256的校验和。
其他该文件的具体内容也就不解释了,上方已经解释过了,这里需要注意一下amd64的digest,下面我们请求image manifest的返回的内容的sha256的校验和正是这个值。
获取Image Manifest
请求Image Manifest内容和请求Manifest的方式是一样的,只需要修改mediaType的类型为application/vnd.docker.distribution.manifest.v2+json
1 | # head_accept='Accept: application/vnd.docker.distribution.manifest.v2+json' |
说明:
- 上方URL中的
library/ubuntu
替换为你的镜像仓库和镜像名称。 - 上方URL中的
latest
为镜像的tag,替换成相应的即可。 - 可以看下Header中的
Docker-Content-Digest
对应的正是上个Manifest List文件中amd64对应的digest,该值也正是本次请求context的sha256的校验和。 - 这里可以记住
config
下的digest
,这个digest
对应的正式存放镜像信息文件的sha256的校验和。
根据digest
我们可以确定,在请求的URL中指明CPU的架构、OS等信息,但是仓库还是返回给了我们正确的镜像。
获取Image的配置信息
1 | # head_accept='Accept: application/vnd.docker.distribution.manifest.v2+json' |
注意:为了方便观看,上方返回的json我做了格式化处理。
获取镜像层的信息
1 | HTTP/1.1 200 Connection Established |