Registry 使用Go语言编写,在性能和安全性上做了很多优化,重新设计了镜像的存储格式。
如果需要安装registry ,只需下载最新的registry镜像即可,应该说此类仓库搭建只能用于测试学习之用,不能用于生产环境。
生产环境中,请使用 nexus或harbor之类的可以用来构建docker镜像仓库软件!
一、实验环境
两台装有Docker的CentOS7.2虚拟机
虚拟机1:192.168.112.132 用作测试机
虚拟机2:192.168.112.136 用作私有仓库
此处我们准备了两个虚拟机,分别都安装了Docker,其中132机器用作开发机,136机器用作registry私有仓库机器。环境准备好之后接下来我们就开始搭建私有镜像仓库。
二、搭建私有仓库
首先在136机器上下载registry镜像
# docker pull registry
用镜像启动一个容器
# docker run -d -p 5000:5000 registry
默认情况下,会将仓库存放于容器内的/tmp/registry目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地一个目录挂载到容器内的/tmp/registry下。
# docker run -d -p 5000:5000 --privileged=true --restart=always --name=docker_registry -v /opt/data/registry:/tmp/registry registry
可以看到我们启动了一个容器,地址为:192.168.112.136:5000
相关参数说明:
-p --publish 端口映射
-v /opt/registry:/tmp/registry 默认情况下,会将仓库存放于容器内的/tmp/registry目录下,指定本地目录挂载到容器
--privileged=true CentOS7中的安全模块selinux把权限禁掉了,参数给容器加特权。不加上传镜像会报权限错误(OSError: [Errno 13] Permission denied: '/tmp/registry/repositories/liibrary')或者(Received unexpected HTTP status: 500 Internal Server Error)错误
--restart=always 创建容器,设置为随docker启动
--name 容器名,此处为仓库名
三、实验测试
将一个本地镜像push到私有仓库中,首先在132机器下pull一个比较小的镜像来测试(此处使用的是busybox)
# docker pull busybox
给镜像打tag,tag不加版本号,默认是latest
# docker tag busybox 192.168.112.136:5000/busybox
tag 加上特定的版本号v1
# docker tag busybox 192.168.112.136:5000/busybox:v1
将打了tag的镜像上传到私有仓库
# docker push 192.168.112.136:5000/busybox
# docker push 192.168.112.136:5000/busybox:v1
可以看到push失败,具体错误如下:
Error: Invalid registry endpoint https://192.168.112.136:5000/v1/: Get https://192.168.112.136:5000/v1/_ping: dial tcp 192.168.112.136:5000: connection refused.
If this private registry supports only HTTP or HTTPS with an unknown CA certificate, please add `--insecure-registry 192.168.112.136:5000` to the daemon's arguments. In the case of HTTPS, if you have access to the registry's CA certificate, no need for the flag; simply place the CA certificate at /etc/docker/certs.d/192.168.112.136:5000/ca.crt
因为Docker从1.3.X之后,与docker registry交互默认使用的是https,然而此处搭建的私有仓库只提供http服务,所以当与私有仓库交互时就会报上面的错误。
为了解决这个问题需要在启动docker server时增加启动参数为默认使用http访问。
修改docker启动配置文件(此处是修改132机器的配置)在其中增加"--insecure-registry 192.168.112.136:5000"
方法一:
修改Docker配置文件
# vim /etc/default/docker
DOCKER_OPTS="$DOCKER_OPTS --insecure-registry 192.168.112.136:5000"
方法二:
通过修改daemon配置文件 /etc/docker/daemon.json
# vim /etc/docker/daemon.json
如果是多个仓库
方法三:
修改docker的启动参数
1. 如果是命令行启动,添加参数 --insecure-registry 192.168.112.136:5000
# dockerd --insecure-registry 192.168.112.136:5000
2.如果用systemctl启动,修改服务的service文件
# vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.112.136:5000
无论使用那种方式,要使得配置生效,都需要重启docker
# systemctl restart docker
# docker info
重启完之后我们再次运行推送命令,把本地镜像推送到私有服务器上
# docker push 192.168.112.136:5000/busybox:v1
可以看到镜像已经push到私有仓库中去了。
我们删除本地镜像,然后从私有仓库中pull下来该镜像。
# docker pull192.168.112.136:5000/busybox
到此就搭建好了Docker私有仓库,上面搭建的仓库是不需要认证的,我们可以结合nginx和https实现认证和加密功能。
四、参考
Authenticate proxy with nginx
https://docs.docker.com/registry/recipes/nginx
透过 nginx 反向代理docker 私有 registry
https://www.jianshu.com/p/265f228a0471
https://blog.csdn.net/wanglei_storage/article/details/51444432