搭建Docker私仓,可以使用docker官方提供的registry镜像。该镜像目前有2.0,2.3和2.3.1版本。它只与1.6.0以上版本的docker兼容。搭建私仓的步骤如下:
一:无代理、无认证的registry
1:下载registry镜像:
这里必须加上标签”:2”,否则的话,不加标签的registry,实际上下载的是标签为”latest”的registry镜像,则不能使用下面的nginx代理镜像:containersol/docker-registry-proxy
2:创建registry容器:
在registry:2创建的私有仓库中,上传的镜像保存在容器的/var/lib/registry目录下。创建registry:2的容器时,会自动创建一个数据卷(Data Volumes),数据卷对应的宿主机下的目录一般为:/var/lib/docker/volumes/XXX/_data。
可以在创建registry:2的容器时,通过-v参数,修改这种对应关系:
-
docker run -d -p 5000:5000 --restart=always –v /opt/docker/registry/data:/var/lib/registry --name docker-registry registry:2
除了可以将数据保存在当前主机的文件系统上,registry也支持其他基于云的存储系统,比如S3,Microsoft Azure, Ceph Rados, OpenStack Swift and
Aliyun OSS等。可以在配置文件中进行配置:https://github.com/docker/distribution/blob/master/docs/configuration.md#storage
以上其实已经创建好了一个docker私有仓库,但是这时候向其push或者pull时还是有问题的:
-
[@hh_93_197 /]# docker tag hello-world 192.168.1.104:5000/hello-world
-
[@hh_93_197 /]# docker push 192.168.1.104:5000/hello-world
-
The push refers to a repository [192.168.1.104:5000/hello-world]
-
unable to ping registry endpoint https://192.168.1.104:5000/v0/
-
v2 ping attempt failed with error: Get https://192.168.1.104:5000/v2/: tls: oversized record received with length 20527
-
v1 ping attempt failed with error: Get https://192.168.1.104:5000/v1/_ping: tls: oversized record received with length 20527
这是因为从docker1.3.2版本开始,使用registry时,必须使用TLS保证其安全。
最简单的解决办法是,在需要连接该私有仓库的所有客户端docker宿主机上,修改dockerdaemon的配置文件,增加insecure-registry参数。
比如,对于Redhat7的宿主机来说,新增文件/etc/systemd/system/docker.service.d/docker.conf,其内容配置如下:
-
[Service]
-
ExecStart=
-
ExecStart=/usr/bin/docker daemon -H fd:// --insecure-registry=192.168.1.104:5000
然后,重启docker:
-
[root@localhost /]# systemctl daemon-reload
-
[root@localhost /]# service docker restart
此时就可以使用该私有仓库了。
但是,上面这种配置方式既不安全(所有人都可以push或pull),也很不方便(使用该私有仓库的所有宿主机上都这样进行配置)。
下面是带有认证的registry私仓构建过程:
二:无代理,有认证的registry
使用TLS认证registry容器时,必须有证书。一般情况下,是要去认证机构购买签名证书。这里使用openssl生成自签名的证书。
1:生成自签名证书
一般情况下,证书只支持域名访问,要使其支持IP地址访问,需要修改配置文件openssl.cnf。
在Redhat7系统中,文件所在位置是/etc/pki/tls/openssl.cnf。在其中的[ v3_ca]部分,添加subjectAltName选项:
-
[ v3_ca ]
-
subjectAltName = IP:192.168.1.104
接下来就是生成自签名的证书:
-
mkdir -p /opt/docker/registry/certs
-
-
openssl req -x509 -days 3650 -nodes -newkey rsa:2048
-
-keyout /opt/docker/registry/certs/domain.key
-
-out /opt/docker/registry/certs/domain.crt
-
...
-
Country Name (2 letter code) [XX]:
-
State or Province Name (full name) []:
-
Locality Name (eg, city) [Default City]:
-
Organization Name (eg, company) [Default Company Ltd]:
-
Organizational Unit Name (eg, section) []:
-
Common Name (eg, your name or your server's hostname) []:192.168.1.104:5000
-
Email Address []:
这里的服务器域名写成”192.168.1.104:5000”,后续就使用该地址访问私仓。其余项直接回车即可。
2:创建带有TLS认证的registry容器
-
docker run
-
-d
-
--name docker-registry-no-proxy --restart=always
-
-v /opt/docker/registry/data:/var/lib/registry
-
-u root
-
-p 192.168.1.104:5000:5000
-
-v /opt/docker/registry/certs:/certs
-
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt
-
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key
-
registry:2
3:配置客户端宿主机
目前,已经搭建好了一个registry私有仓库了。但是,访问该私仓还是会报错:
-
# docker pull 192.168.1.104:5000/redis
-
Using default tag: latest
-
Error response from daemon: unable to ping registry endpoint https://192.168.1.104:5000/v0/
-
v2 ping attempt failed with error: Get https://192.168.1.104:5000/v2/: x509: certificate signed by unknown authority
-
v1 ping attempt failed with error: Get https://192.168.1.104:5000/v1/_ping: x509: certificate signed by unknown authority
这是因为客户端宿主机上没有相应的证书。需要把registry所在主机上,刚生成的证书:
/opt/docker/registry/certs/domain.crt
复制到客户端宿主机上的:
/etc/docker/certs.d/192.168.1.104:5000/ca.crt
之后,就可以使用该私仓了:
-
# docker pull 192.168.1.104:5000/redis
-
Using default tag: latest
-
latest: Pulling from redis
-
80ab95908a2b: Pull complete
-
a3ed95caeb02: Pull complete
-
47a0d79f89b9: Pull complete
-
7190081b1686: Pull complete
-
fe09c22d81ac: Pull complete
-
a5eae2bcc645: Pull complete
-
版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/u010305706/article/details/53466681
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
-
发表于 2019-10-27 18:39:14
- 阅读 ( 1159 )
- 分类:docker