docker push 流程调用接口解析

本文详细解析了docker push过程中涉及的六个步骤,包括Api版本确认、layer存在性校验、POST请求发送、分块上传、layer上传完成及manifest推送。通过HTTP交互,客户端与registry进行交互,确保镜像安全有效地推送到服务器。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

docker push 接口详情

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iNQwLoON-1574158114105)(…/pic/dockerpush.png)]

step 1. Api 版本确认

registry 服务器会通过/v2/接口根据返回的状态码来提供api的版本信息,请求格式如下

GET /v2
  • 如果返回200 OK 则表明registry实现了V2接口,并且客户端可以安全的去使用其他所有的v2接口
  • 如果返回401 Unauthorized, 则表示客户端需要根据WWW-Authenticate header 重新请求接口。根据访问控制设置,用户即使这里通过验证,在访问不同的资源的时候可能仍需身份验证
  • 如果返回404 NOT FOUND ,则客户端应认为registry未实现v2接口

step 2. 校验layer是否存在

可以通过一个HEAD 请求来校验一个layer是否存在。 请求格式如下:

HEAD /v2/<name>/blobs/<digest> 

如果返回的状态码为200 OK ,则表示指定的layer已存在,若已存在则client 则跳过该layer的上传。由于HEAD 请求根据HTTP规范没有body,因此HEADER中带了以下信息

200
Content-Length: <length of blob>
Docker-Content-Digest: <digest> 

以下为抓包的结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hkjxgopU-1574158114106)(…/pic/pushhead.png)]

step 3. 发送post请求

该请求的参数是镜像命名空间,layer将在该命名空间被链接。该请求的格式是:

POST  /v2/<name>/blobs/uploads/

如果返回202 Accepted 则表明请求成功,其HEADER携带了以下信息:

202 Accepted
Location: /v2/<name>/blobs/uploads/<uuid>
Range: bytes=0-<offset>
Content-Length: 0
Docker-Upload-UUID: <uuid>
  • 其中Location 返回下一步镜像上传的地址,其API格式为/v2/<name>/blobs/uploads/<uuid>
  • 如果本地客户端想和远程registry的上传状态相关联,可以使用Docker-Upload-UUID中的值。这个id可以作为上一次 location header 的key 来实现可恢复上传。

抓包结果:

POST /v2/hello-world/blobs/uploads/ HTTP/1.1
Host: hub.vic.com
User-Agent: docker/17.12.0-ce go/go1.9.2 git-commit/c97c6d6 kernel/3.10.0-693.el7.x86
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值