author: zqh
date: 2016-5-24

docker registry v2版本的http api 一直没有找到合适的,自己通过阅读官方文档整理了一下。

概要

method path Entity Description
GET /v2/ Base Check that the endpoint implements Docker Registry API V2.
GET /v2/<name>/tags/list Tags Fetch the tags under the repository identified by name.
GET /v2/<name>/manifests/<reference> Manifest Fetch the manifest identified by nameand referencewhere referencecan be a tag or digest. A HEADrequest can also be issued to this endpoint to obtain resource information without receiving all data.
PUT /v2/<name>/manifests/<reference> Manifest Put the manifest identified by nameand referencewhere referencecan be a tag or digest.
DELETE /v2/<name>/manifests/<reference> Manifest Delete the manifest identified by nameand reference. Note that a manifest can only be deleted by digest.
GET /v2/<name>/blobs/<digest> Blob Retrieve the blob from the registry identified bydigest. A HEADrequest can also be issued to this endpoint to obtain resource information without receiving all data.
DELETE /v2/<name>/blobs/<digest> Blob Delete the blob identified by nameand digest
POST /v2/<name>/blobs/uploads/ Initiate Blob Upload Initiate a resumable blob upload. If successful, an upload location will be provided to complete the upload. Optionally, if thedigest parameter is present, the request body will be used to complete the upload in a single request.
GET /v2/<name>/blobs/uploads/<uuid> Blob Upload Retrieve status of upload identified byuuid. The primary purpose of this endpoint is to resolve the current status of a resumable upload.
PATCH /v2/<name>/blobs/uploads/<uuid> Blob Upload Upload a chunk of data for the specified upload.
PUT /v2/<name>/blobs/uploads/<uuid> Blob Upload Complete the upload specified by uuid, optionally appending the body as the final chunk.
DELETE /v2/<name>/blobs/uploads/<uuid> Blob Upload Cancel outstanding upload processes, releasing associated resources. If this is not called, the unfinished uploads will eventually timeout.
GET /v2/_catalog Catalog Retrieve a sorted, json list of repositories available in the registry.

专有名词解释

  • repository name(存储库名称)
存储库指在库中存储的镜像

  • 语法
  • 经典存储库名称由两级路径构成,每级路径小于30个字符,v2的api不强制要求这样的格式
  • 每级路径名至少有一个小写字母或者数字,使用句号,破折号和下划线分隔。 更严格来说,它必须符合正则表达式:[a-z0-9]+(?:[._-][a-z0-9]+)*
  • 多级路径用/分隔
  • 存储库名称总长度(包括/)不能超过256个字符
  • digest(概要)
概要是镜像各个层的唯一标识。虽然算法允许使用任意算法,但是为了兼容性应该使用sha256。
例:sha256:6c3c624b58dbbcd3c0dd82b4c53f04194d1247c6eebdaab7c610cf7d66709b3b

  • 语法
digest    := algorithm ":" hex
algorithm := /[A-Fa-f0-9_+.-]+/
hex       := /[A-Fa-f0-9]+/

  • 生成摘要的伪代码
let C = 'a small string'
let B = sha256(C)
let D = 'sha256:' + EncodeHex(B)
let ID(C) = D

PULL镜像过程

镜像由一个json清单和 层叠文件组成,pull镜像的过程就是检索这两个组件的过程。
拉取镜像的第一步就是获取清单,清单由下面几个字段组成:

字段 描述
name 镜像名称
tag 镜像当前版本的tag
fsLayers 层描述列表(包含摘要)
signature 一个JWS签名,用来验证清单内容
当获取清单之后,客户端需要验证签名(signature),以确保名称和层是有效的。确认后,
客户端可以使用digest去下载各个层,在v2API中,层存储在blobs中以digest作为键值。

  1. Pulling an Image Manifest(拉取镜像清单)
  • API
>>> HEAD /v2/<name>/manifests/<reference> #检查镜像清单是否存在
>>> GET /v2/<name>/manifests/<reference>  #拉取镜像清单

Note

reference可以是tag或者是digest

  1. Pulling a Layer(拉取层)
  • API
>>> GET /v2/<name>/blobs/<digest>

PUSHING镜像过程

推镜像和拉取镜像过程相反,先推各个层到registry仓库,然后上传清单。

  1. Pushing a Layer(上传层)
上传层分为两步,第一步使用post请求在registry仓库启动上传服务
,返回一个url,这个url可以用来上传数据和检查状态。

  1. Existing Layers(检查层是否存在)
  • API
>>> HEAD /v2/<name>/blobs/<digest>

  • RETURN

    若返回200 OK则表示存在,不用上传

  1. Starting An Upload(启动上传服务)
  • API
>>> POST /v2/<name>/blobs/uploads/

  • RETURN

如果post请求返回202 accepted,一个url会在location字段返回.

202 Accepted
Location: /v2/<name>/blobs/uploads/<uuid>
Range: bytes=0-<offset>
Content-Length: 0
Docker-Upload-UUID: <uuid> # 可以用来查看上传状态和实现断点续传

  1. Uploading the Layer(上传层)
  1. Upload Progress(上传进度)
  • API
>>> GET /v2/<name>/blobs/uploads/<uuid>
>>> Host: <registry host>

  • RETURN
204 No Content
Location: /v2/<name>/blobs/uploads/<uuid>
Range: bytes=0-<offset>
Docker-Upload-UUID: <uuid>

  1. Monolithic Upload(整块上传)
  • API
>>> PUT /v2/<name>/blobs/uploads/<uuid>?digest=<digest>
>>> Content-Length: <size of layer>
>>> Content-Type: application/octet-stream
<Layer Binary Data>

  1. Chunked Upload(分块上传)
  • API
>>> PATCH /v2/<name>/blobs/uploads/<uuid>
>>> Content-Length: <size of chunk>
>>> Content-Range: <start of range>-<end of range>
>>> Content-Type: application/octet-stream
<Layer Chunk Binary Data>

  • RETURN
  • 如果服务器不接受这个块,则返回:
416 Requested Range Not Satisfiable
Location: /v2/<name>/blobs/uploads/<uuid>
Range: 0-<last valid range>
Content-Length: 0
Docker-Upload-UUID: <uuid>

  • 成功返回:
202 Accepted
Location: /v2/<name>/blobs/uploads/<uuid>
Range: bytes=0-<offset>
Content-Length: 0
Docker-Upload-UUID: <uuid>

  1. Completed Upload(上传完成)

分块上传在最后一块上传完毕后,需要提交一个上传完成的请求

  • API
>>> PUT /v2/<name>/blob/uploads/<uuid>?digest=<digest>
>>> Content-Length: <size of chunk>
>>> Content-Range: <start of range>-<end of range>
>>> Content-Type: application/octet-stream
<Last Layer Chunk Binary Data>

  • RETURN
201 Created
Location: /v2/<name>/blobs/<digest>
Content-Length: 0
Docker-Content-Digest: <digest>

  1. Canceling an Upload(取消上传)

这个请求执行后uuid将失效,当上传超时或者没有完成,客户端都应该发送这个请求。

  • API
>>> DELETE /v2/<name>/blobs/uploads/<uuid>

  1. Cross Repository Blob Mount(交叉挂载层)

此api可把客户端有访问权限的已有存储库中的层挂载到当前储存库中。

  • API
>>> POST /v2/<name>/blobs/uploads/?mount=<digest>&from=<repository name>
Content-Length: 0

  • RETURN
  • 成功返回:
201 Created
Location: /v2/<name>/blobs/<digest>
Content-Length: 0
Docker-Content-Digest: <digest>

  • 失败返回:
202 Accepted
Location: /v2/<name>/blobs/uploads/<uuid>
Range: bytes=0-<offset>
Content-Length: 0
Docker-Upload-UUID: <uuid>

  1. Deleting a Layer(删除层)
  • API
>>> DELETE /v2/<name>/blobs/<digest>

  • RETURN
  • 成功返回:
202 Accepted
Content-Length: None

  • 失败返回404错误。
  1. Pushing an Image Manifest(上传镜像清单)

当镜像层上传完毕后,可以上传清单。

  • API
>>> PUT /v2/<name>/manifests/<reference>
Content-Type: <manifest media type>
{   "name": <name>,
   "tag": <tag>,
   "fsLayers": [
      {         "blobSum": <digest>
      },
      ...
    ]
   ],
   "history": <v1 images>,
   "signature": <JWS>,
   ...
}

  • RETURN

如果清单中有层是未知的,则返回:

{"errors:" [{"code": "BLOB_UNKNOWN","message": "blob unknown to registry","detail": {"digest": <digest>}},...]
}

检索功能

  1. Listing Repositories(列出存储库)
  • API
>>> GET /v2/_catalog

  • RETURN
200 OK
Content-Type: application/json
{"repositories": [<name>,...]
}

  1. Pagination(部分列出存储库)
  • API
>>> GET /v2/_catalog?n=<integer>

Note

integer表示要列出库的个数

  • RETURN
200 OK
Content-Type: application/json
Link: <<url>?n=<n from the request>&last=<last repository in response>>; rel="next"
{"repositories": [<name>,...]
}

  1. Listing Image Tags(列出镜像tag)
  • API
>>> GET /v2/<name>/tags/list

  • RETURN
200 OK
Content-Type: application/json
{"name": <name>,"tags": [<tag>,...]
}

  1. Pagination(部分列出镜像tag)
  • API
>>> GET /v2/<name>/tags/list?n=<integer>

  • RETURN
200 OK
Content-Type: application/json
Link: <<url>?n=<n from the request>&last=<last tag value from previous response>>; rel="next"
{"name": <name>,"tags": [<tag>,...]
}

Deleting an Image(删除镜像)

  • API
>>> DELETE /v2/<name>/manifests/<reference>

  • RETURN
  • 成功
202 Accepted
Content-Length: None

  • 失败返回404错误

docker registry http api v2(原创请注明出处)相关推荐

  1. 特此郑重声明!我的文章全部是原创作品!转载请注明出处!

    特此郑重声明! 我的帖子全部是原创作品!转贴请注明出处!如有任何问题或不解,请给我发邮件:yang.yang@jado.cn 或者通过msn:seeblue1981@hotmail.com联系我!有什 ...

  2. 淘宝网的实习生笔试题以及经历--2011 4 1(转载请注明出处,即原创网址)

      昨天晚上7:00在西北工业大学,参加了淘宝网的实习生笔试(技术类),我应聘的是软件研发类.这一方面的人很多. 愚人节这一天,而且又下起了雨,路上车慢的很,感觉挺不顺利的,心情有点糟.到达笔试现场后 ...

  3. SilverLight学习笔记--如何在xaml文件中操作用户在后台代码定义的类(2)--示例篇:创建一个登录控件(原创)(转载本文请注明出处)...

    本文将示例如何运用前篇所写知识来建立一个用户自定义的登录控件.此控件界面非常简单,主要涉及的知识点是:   如何创建用户控件(包括对此控件的自定义事件和属性的编写,此处我们将创建一个名为LoginBo ...

  4. PyTorch踩过的坑(长期更新,转载请注明出处)

    最近在知乎看到有人转载了这里的内容,提醒一下,欢迎转载,但是请注明出处,谢谢. 1. nn.Module.cuda() 和 Tensor.cuda() 的作用效果差异 无论是对于模型还是数据,cuda ...

  5. 片上总线Wishbone 学习—— 转载请注明出处:http://blog.csdn.net/ce123

    片上总线Wishbone 学习(零)前言 声明:版权所有,欢迎转载! 转载请注明出处:http://blog.csdn.net/ce123 为了更加升入的理解片上系统,比如S3C2440等,今天开始学 ...

  6. 引用请注明出处和转载请注明出处?我的看法

    很多文章和网站 都有这么一条: 引用请注明出处和转载请注明出处,有的无非多了个什么 保留法律权力 之类的 其实想想看,国外XX 小站 "拿去用了" 怎么办,起诉? BT下载&quo ...

  7. 手写多位数字识别器实现 (转载请注明出处!)

    1.主要功能 ①界面化的输入方式,进行实时数字识别 ②可以识别多位的数字,例如23,234 ③CNN进行数字识别 2.运行环境 Windows10.python3.7+.tensorflow2.x 3 ...

  8. 程序员编程思想之数学素养(转载时请注明出处)

    数值分析中的哲学思想 转载时请注明出处:http://blog.csdn.net/makeyourchance/article/details/3812197 高等数学中我们遇到的问题 (1)遇到超越 ...

  9. 转载本博客文章时请注明出处

    近来发现很多网站或者博客在转载本人的文章,遗憾的是大多没有注明出处.鉴于韩寒被人质疑构陷的惨痛教训,而我又悲催地没有手稿,一朝被人质疑,必将无法自证,因此肯定各位转载者,转载本人博文时请注明出处(哪怕 ...

最新文章

  1. ArcFace - 人脸识别
  2. 如何在页面调用JS函数的代码
  3. ubuntu 图形化更换apt源
  4. 百万农民创大业-农业大健康:产业融合谋定振兴乡村唱大戏
  5. python的hashlib库
  6. win7中输入文件夹首字母跳到相应的文件或者文件夹,却在搜索栏出现输入的字母...
  7. 在减少对内地房地产投资的同时,加快了在内地零售业的布局;并积极推动“走出去”战略,在全球52个国家投资多种业务。...
  8. 《Python从小白到大牛》第5章 Python编码规范
  9. SHELL下如何去掉字串里的空格(或指定字符)
  10. halcon轮廓擦除_Halcon中轮廓分割segment
  11. Ubuntu18.04设置截屏快捷方式
  12. 【Linux】Linux发行版本的简介与选择
  13. Unity 延时的三种方法
  14. 【原创】基站定位小测
  15. 智能导购系统设计与实现
  16. 【调剂】上海海事大学2022年硕士研究生调剂公告
  17. Java日记:API入门
  18. 五虎遁月 和 五鼠遁时 法
  19. 在线求F4V格式播放器代码
  20. HTML-表格、表单

热门文章

  1. Ajax提交form表单的内容,并判断是否提交成功,提交确认提示框,确认提交,取消,回退缓存的数据
  2. 选择样式的日期时间js代码
  3. 富可视m310 android 4.4,富可视 M310 4.2.1 ROM刷机包 版本发布公告
  4. 青龙脚本库总结(不定期更新版)10月12日
  5. 零代码在线绘制GO富集结果GOcircle图
  6. spark hive执行树
  7. 心脏和字节只有一个跳动,生命和工资只能拼一个多多
  8. Javaweb学生管理系统期末设计
  9. 学习记录:关于Uniapp与Java实现支付宝沙箱APP内支付
  10. C++学习课件(三)