docker从入门到放弃——搭建私有仓库 - Go语言中文社区

docker从入门到放弃——搭建私有仓库


可能会有人关心,都已经有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

一些参数的解释:

  • -v /home/hzq/registry:/var/lib/registry 默认情况下,会将仓库存放于容器内的/var/lib/registry目录下,这样容器如果挂了,push的镜像可能就丢了,所以指定本地目录挂载到容器。
  • -p 5000:5000 端口映射
  • --restart=always1 在容器退出时总是重启容器,主要应用在生产环境
  • --privileged=true 在CentOS7中的安全模块selinux把权限禁掉了,参数给容器加特权,不加上传镜像会报权限错误OSError: [Errno 13] Permission denied: ‘/tmp/registry/repositories/liibrary’)或者(Received unexpected HTTP status: 500 Internal Server Error)错误
  • --name registry 指定容器的名称

(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

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/weixin_42401666/article/details/81027207
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2019-09-05 18:16:10
  • 阅读 ( 1232 )
  • 分类:docker

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢