Docker Registry2.3的Cross Repository Push

Registry介绍

Docker用户肯定都是pull过镜像,这是最基本的Docker操作。Pull镜像就是把镜像从Registry下载到本地的过程。Registry是Docker的镜像存储、分发服务。Docker官方提供了默认Registry服务,第三方也可以部署自己的Registry服务。阿里云Hub服务使用的就是自己的Registry服务,因为在国内,所以Pull、Push镜像都很快。

Registry1到2

目前Docker Registry有两个版本: v1和v2。Docker的向后兼容做的很差,v2和v1的registry变化很大,完全不兼容。Docker1.6开始支持v2,后续版本会放弃对v1的支持,只支持v2。目前阿里云Hub服务提供的是v2版本的registry,需要使用docker1.6+.

Registry2.3的Cross Repository Push

终于说到本文的重点了。Registry2.3之前,Docker Registry一直不支持跨Repository之间的层共享。举个栗子:我从阿里云Hub pull了一个Ubuntu的镜像 registry.aliyuncs.com/acs-sample/ubuntu,基于这个镜像构建了我自己的应用镜像:registry.aliyuncs.com/jiangjizhong/myapp,然后registry.aliyuncs.com/jiangjizhong/myapp push回阿里云hub服务。

cd myapp
docker pull registry.aliyuncs.com/acs-sample/ubuntu
docker build -t registry.aliyuncs.com/jiangjizhong/myapp .
docker push registry.aliyuncs.com/jiangjizhong/myapp

可以看到,Docker会把registry.aliyuncs.com/jiangjizhong/myapp对应的所有数据全部推送到Hub服务上,包括Ubuntu对应的层。很多人可能会疑惑:Ubuntu明明已经在Hub上了,为什么不重用,还要再推过去一次?确实,不过Docker就是这么做的。我自己的应用可能很小,大量的时间花费在Push Ubuntu上了。考虑另外一个场景:我们有持续集成环境,基于我们自己的Base镜像,把每个应用都构建成Docker镜像,Push到Hub上去,由于镜像数量很多,每个应用都是要Push一次Base镜像,浪费了大量的时间。

2.3 Registry终于解决了这个问题:可以跨Repository共享层。上面的例子中,可以不再多次Push Base镜像,而可以利用Registry里已有的镜像。

不过还是有很多要注意的点。

  • 首先,Docker的版本要升级到1.10+,低版本的Docker不支持这个功能。
  • 其次,是否重新Push Base镜像是由本地的Docker决定的,而不是Registry。Docker怎么知道Registry上有没有Base镜像呢?它判断的方式也比较简单:如果已经Push过一次,Registry上肯定存在了这个层,如果曾经Pull过,Registry上肯定也存在这个层。Docker会保存这些信息,再根据这些信息判断是否重用Registry上层。因此,如果你是刚刚安装的Docker,Push镜像一定会全部层都Push一次。
上一篇:Docker的Pull Digest和Image ID


下一篇:所谓的"新姿势之Docker Remote API未授权访问漏洞分析和利用"