可能会有人关心,都已经有docker hub了,干嘛还要搭私有仓库,以下是一些原因:
引自: https://blog.csdn.net/RonnyJiang/article/details/71189392
(1)有时我们在从dockerhub上下载和上传镜像速度可能受影响。
(2)我们在生产上所使用的docker镜像可能存放着我们的code,tools,不想被外部人员获取,只允许内网的开发人员下载。如 果上传到dockerhub上所有人都可以看到。这和github上的公共库是一样的。
(3)在内部网络搭建docker私有仓库可以使内网人员下载和上传都非常快速,不受外网带宽等因素的影响,同时不在内网的人 员无法下载我们的镜像,上述两个问题都很好的解决了。
下面开始搭建简单的docker私有仓库:
搭建环境:centos7,两台虚拟机184和193,以193作为registry服务器。
(1)193上面拉取registry镜像,运行以下命令直接拉取镜像并开启一个容器:
docker run -d -v /root/allen/registry:/var/lib/registry -p 5000:5000 --privileged=true --name registry_a registry:latest
一些参数的解释:
(2)在183上面拉一个tomcat作为测试镜像:
docker pull tomcat:7.0-jre7-alpine
然后,我们执行以下命令,标记本地镜像,并将其归入新建的仓库(tag后面接的镜像id):
docker tag 8812d3c5a978 172.20.10.193:5000/tomcat7:v1
最后我们push以下,推送本地镜像到私有仓库试试:
[root@docker181 ~]# docker push 172.20.10.193:5000/tomcat7:v1
The push refers to a repository [172.20.10.193:5000/tomcat7]
Get https://172.20.10.193:5000/v1/_ping: http: server gave HTTP response to HTTPS client
咦,这是啥情况,也没说成功,我们只好去看一下私有仓库里面有没有tomcat7镜像,方式是通过rest api,而不是docker命令喽:
curl -XGET http://172.20.10.193:5000/v2/_catalog
发现啥也没有,有点尴尬
网上查了一下,是因为Docker从1.3.X之后,与docker registry交互默认使用的是https,然而此处搭建的私有仓库只提供http服务,所以当与私有仓库交互时就会报上面的“错误”。所以,修改一下docker服务的脚本:
vi /usr/lib/systemd/system/docker.service
找到ExecStart,在后面加上一个参数
--insecure-registry 172.20.10.193:5000
注意如果命令有换行别忘记加“ \”
然后,重启一下docker服务:
[root@docker181 ~]# systemctl daemon-reload
[root@docker181 ~]# systemctl start docker
再重新push一下:
[root@docker181 ~]# docker push 172.20.10.193:5000/tomcat7:v1
The push refers to a repository [172.20.10.193:5000/tomcat7]
3b23f5c026d8: Pushed
b0c9815088bf: Pushed
3b82a8c0b82a: Pushed
3410df2187d8: Pushed
298c3bb2664f: Pushed
73046094a9b8: Pushed
v1: digest: sha256:ab2f6012eedf0e13d4f492865a755f21f9616ae3ed01affb9ab407ffa792c26b size: 1574
好像成了,我们去私有仓库看一下:
[root@docker181 ~]# curl -XGET http://172.20.10.193:5000/v2/_catalog
{"repositories":["tomcat7"]}
[root@docker181 ~]# curl -XGET http://172.20.10.193:5000/v2/image_name/tags/list
{"errors":[{"code":"NAME_UNKNOWN","message":"repository name not known to registry","detail":{"name":"image_name"}}]}
[root@docker181 ~]# curl -XGET http://172.20.10.193:5000/v2/tomcat7/tags/list
{"name":"tomcat7","tags":["v1"]}
打完收工!
不好意思漏了一点,如何删除私有仓库的镜像呢?虽然这个操作不频繁,但是有时候也会需要。
其实,Docker registry在2.1版本中已经支持了删除镜像的API,但这个删除操作只会删除镜像元数据,不会删除层数据。在2.4版本中对这一问题进行了解决,增加了一个垃圾回收命令,可以删除未被引用的层数据,详情参见:https://www.cnblogs.com/Tempted/p/7768694.html