【Docker Registry】用docker registry 镜像搭建私有测试仓库

Registry 使用Go语言编写,在性能和安全性上做了很多优化,重新设计了镜像的存储格式。

如果需要安装registry ,只需下载最新的registry镜像即可,应该说此类仓库搭建只能用于测试学习之用,不能用于生产环境。

生产环境中,请使用 nexus或harbor之类的可以用来构建docker镜像仓库软件!


一、实验环境

两台装有Docker的CentOS7.2虚拟机

虚拟机1:192.168.112.132 用作测试机

虚拟机2:192.168.112.136 用作私有仓库

此处我们准备了两个虚拟机,分别都安装了Docker,其中132机器用作开发机,136机器用作registry私有仓库机器。环境准备好之后接下来我们就开始搭建私有镜像仓库。


12979420-11abd9c567271be9.png

二、搭建私有仓库 

首先在136机器上下载registry镜像

# docker pull registry


12979420-39219f03043ac46f.png

用镜像启动一个容器

# 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


12979420-ac6dcf3c44d3e25a.png

可以看到我们启动了一个容器,地址为: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


12979420-07f45af4d8050835.png

如果是多个仓库


12979420-11d4b5ab5e87aeac.png


方法三:

修改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


12979420-6a045e5c32d2176f.png

无论使用那种方式,要使得配置生效,都需要重启docker

# systemctl  restart docker 

# docker info

重启完之后我们再次运行推送命令,把本地镜像推送到私有服务器上

# docker  push192.168.112.136:5000/busybox

可以看到镜像已经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

猜你喜欢

转载自blog.csdn.net/weixin_34375233/article/details/87230910