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