在Docker生态圈中,Docker仓库用于存储Docker镜像。官方的Docker hub存储了大量镜像,但是对于实际生产环境中,考虑到pull/push速度和保密性等因素,我们往往需要建立自己的镜像仓库服务。官方(docker-registry github )提供了一个registry images,使用这个images就可以快速完成本地镜像仓库的建立。
Registry在github上有两份代码:老代码库和新代码库。老代码是采用python编写的,存在pull和push的性能问题,出到0.9.1版本之后就标志为deprecated,不再继续开发。从2.0版本开始就到在新代码库进行开发,新代码库是采用go语言编写,修改了镜像id的生成算法、registry上镜像的保存结构,大大优化了pull和push镜像的效率。
Registry的部署
需要 Docker version 1.6.0 或更新。
启动registry,并将服务映射到主机的5000端口上:
从官方pull个镜像并打上本地registry的tag:
push到本地registry:
从本地registry重新pull下来:
停止registry:
存储
默认情况下,registry数据通过主机文件系统的docker volume实现持久化。你也可以自己进行修改:
启动registry,这里使用本地目录作为存储,。
Registry服务默认会将上传的镜像保存在容器的/var/lib/docker/registry,我们将主机的/opt/registry目录挂载到该目录,即可实现将镜像保存到主机的/opt/registry目录了。
运行docker ps看一下容器情况,
检测http服务状态:
从本地仓库上获取有哪些镜像
验证
现在我们通过将镜像push到registry来验证一下。我的机器上有个hello-world的镜像,我们要通过docker tag将该镜像标志为要推送到私有仓库,新image名称必须带有”主机IP:5000”。
接下来,我们运行docker push将hello-world镜像push到我们的私有仓库中,
查看registry挂载的目录,可以看到images已经被成功上传。
现在我们可以先将我们本地的127.0.0.1:5000/hello-world和hello-world先删除掉,
然后使用docker pull从我们的私有仓库中获取hello-world镜像,
同样,通过查看registry的日志,可以看到images通过PUT/GET来操作。
Running a domain registry
Get a certificate
可能问题
可能会出现无法push镜像到私有仓库的问题。这是因为我们启动的registry服务不是安全可信赖的。这是我们需要修改docker的配置文件/etc/default/docker,添加下面的内容,
然后重启docker后台进程,再push即可。