docker推拉时的数据交换详解

前言

docker用了这么久了, 有没有想过, 在执行docker pushdocker pull命令的时候, 数据是如何传递的呢? 换句话说, 如果要实现一个镜像仓库, 针对推拉的服务, 如何实现接口呢?

根据OCI 分发规范文档 的描述, 已经对整个推拉过程中要调用的接口有描述了. 但是, 纸上学来终觉浅, 我还是决定针对harbor仓库进行推拉操作的抓包, 看看实际上接口调用是怎样的.

以下所有抓包, 均为本地搭建的 harbor仓库(在实现上可能与OCI 略有差异).

pull

执行命令: docker pull hub.hujingnb.com:8090/library/alpine:2.6

抓包结果如下(层在本地没有, 需要下载):

在这里插入图片描述

根据OCI文档对流程进行说明(第1个请求用于建立连接, 跳过):

METHOD接口说明OCI 对应
GET/v2尝试获取仓库的API 版本. 此接口在响应头中标记了获取权限的地址:
Www-Authenticate Bearer realm="http://hub.hujingnb.com:8090/service/token",service="harbor-registry"
GET/service/token根据上一步提供的地址, 获取访问令牌
HEAD/v2/library/alpine/manifests/2.6从这一步开始拉取镜像. 检查镜像是否存在, 若不存在返回状态码404. 若存在, 同时将镜像的哈希返回到响应头中:
Docker-Content-Digest sha256:5c4217c00be9ecba7735157998a4ac0475b5381c8c885396baa6f798f7f839db
/v2/<name>/manifests/<reference>
GET/v2/library/alpine/manifests/sha256:5c42…获取镜像的manifests信息/v2/<name>/manifests/<reference>
GET/v2/library/alpine/blobs/sha256:c954…根据上一步拿到的镜像结果, 下载各个层信息 (在这一步会校验, 若层在本地已经存在, 则跳过下载)/v2/<name>/blobs/<digest>

通过以上接口调用, 就已经拿到了一个镜像的所有信息.

push

执行命令: docker push hub.hujingnb.com:8090/library/alpine:3.1

抓包结果:

在这里插入图片描述

根据OCI文档对流程进行说明(第1个请求用于建立连接, 跳过):

METHOD接口说明OCI 对应
GET/v2同上
GET/service/token同上
HEAD/v2/library/alpine/blobs/sha256:0f25…判断层是否存在. 若在远端不存在, 则返回404/v2/<name>/blobs/<digest>
POST/v2/library/alpine/blobs/uploads/开始一次层上传. 响应202成功, 在响应头的Location字段标明上传地址/v2/<name>/blobs/uploads
PATCH/v2/library/alpine/blobs/uploads/6c82…使用上一步返回的Location地址执行上传任务, 分片上传/v2/<name>/blobs/uploads/<reference>
PUT/v2/library/alpine/blobs/uploads/6c82…标识本次上传完毕/v2/<name>/blobs/uploads/<reference>
HEAD/v2/library/alpine/blobs/sha256:0f25…在层上传完毕后, 再次调用接口检查是否上传成功. 返回200说明存在/v2/<name>/blobs/<digest>
重复操作上传所有层
PUT/v2/library/alpine/manifests/3.1所有层上传完毕, 推送镜像manifests信息/v2/<name>/manifests/<reference>

以上, 一个镜像就成功的推送到镜像仓库了. 推送基本上就是把pull的操作反过来.

其他

更具体的, 可以查看OCI 分发规范, 拢共也没多少, 可以通读一遍. 在这个位置 定义了一些接口规范, 可以看一下.

对于仓库的实现, 可以查看harbor 源码, 也可以查看distribution 来了解其实现.

其实整个看下来, 倒也不觉得神秘了, 无非就是一些数据的上传, 全部使用HTTP协议, 散会

  • 12
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值