最近在研究 containerd 中下载镜像的流程,具体的代码没看太懂,但是通过打 log 的方式把大致的流程和 API 摸清了,记录一下
API
- /v2/[namespace]/[image]/manifests/[tag] 获取镜像配置
- /v2/[namespace]/[image]/blobs/[ID] 获取相关的文件
例如从官方仓库中下载 Nginx 的 alpine 版本,则 namespace 为 library ,image 为 nginx ,tag 为 alpine
例如下载用户 person1 提交的镜像 nodeserver ,版本号为 1.2,则 namespace 为 person1,image 为 nodeserver,tag 为 1.2
流程
以从 docker 官方仓库下载 nginx:alpine
为例
首先,获取 token
1 | curl https://auth.docker.io/token?service=registry.docker.io&scope=repository:library/nginx:pull |
返回值为(略去了部分字段):
1 | {"token": "ey ...."} |
之后的请求需要带上这个 token ,这里就默认保存在环境变量 TOKEN
中
随后,发起请求获取 manifest
1 | curl -vL \ |
得到的 response 的 header 中,字段 Docker-Content-Digest
记录着 manifest 对应的 sha256 哈希值,我觉得可以将其看作是它的 ID,为 sha256:1e9c503db9913a59156f78c6420f6e2f01c8a3b71ceeeddcd7f604c4db0f045e
,body 的字段为该镜像对应的所有平台版本的列表,结果如下:
1 | { |
当然,如果你使用它的 sha256 的值代替 alpine ,会得到相同的结果。请求代码如下:
1 | curl -L \ |
得到这个列表之后,从中选取合适的平台,比如说第一个,linux/amd64 ,则选取它的 sha256 的值 sha256:210a2ddbc64ef162913f6e1d81fdc29efed14f35aa77716ab5e952959833c831
发起类似于上一个的请求:
1 | curl -L \ |
得到的结果如下。包含有镜像的配置信息和镜像各个层的信息。
1 | { |
接下来要做的就是将这些文件一一下载即可,这里选取第一个做示例:
1 | curl -L \ |
部分结果如下:
1 | { |