在前面的版本中我们我们快速的启动了一个我们自己的私有registry
V2版本
https://www.qnjslm.com/ITHelp/420.html
这个registry有一些列的问题,例如我们的物理服务器发生重启后,容器无法自动启动,这里我们需要添加参数--restart always 来保证开机重启,如下命令
$ docker run -d -p 5000:5000 --restart=always --name registry registry:2
如果需要修改registry容器里监听端口REGISTRY_HTTP_ADDR=0.0.0.0:5001
$ docker run -d -e REGISTRY_HTTP_ADDR=0.0.0.0:5001 -p 5001:5001 --name registry-test registry:2
我们知道容器内是无法持久化保存内容的,所有我们会把上传的镜像保存到持久化存储中,示例把主机上的目录挂载到registry的images目录
如下示例:
把主机的/mnt/registry
挂载到容器中的
/var/lib/registry
目录
$ docker run -d -p 5000:5000 --restart=always --name registry -v /mnt/registry:/var/lib/registry registry:2
使用https 安全的访问
首现我们创建自签名证书,不说了网上教程一大堆
这里我们沿用创建V1版本的证书,首现使用-v 把目录映射到容器内,然后加载证书
[root@registry opt]# docker run -d --restart=always -v /etc/pki/tls/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/self.crt -e REGISTRY_HTTP_TLS_KEY=/certs/self.key -p 443:443 alex/registry-www.opskb.com
验证下
上传下载一样正常进行
有时候为了安全、我们的docker需要认证后才能访问,这里设置基于简单的认证方式(htpasswd)
1、通过docker创建用户名和密码
[root@registry opt]# mkdir auth
[root@registry opt]# docker run --entrypoint htpasswd alex/registry-www.opskb.com -Bbn alex P@ssw0rd >auth/htpasswd
2、运行docker
docker run -d -p 5001:5000 --name alex_registry -v /opt/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Base Auth" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd alex/registry-www.opskb.com
通过浏览器访问查看结果
[root@registry opt]# curl http://localhost:5001/v2/
{"errors":[{"code":"UNAUTHORIZED","message":"authentication required","detail":null}]}
[root@registry opt]#
在进一步操作,设置为SSL模式,和自动启动,最终设置如下,有点长
[root@registry opt]# docker run -d -p 443:443 --restart=always -v /opt/registry:/var/lib/registry --name alex_registry -v /etc/pki/tls/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/self.crt -e REGISTRY_HTTP_TLS_KEY=/certs/self.key -v /opt/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Base Auth" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd alex/registry-www.opskb.com
美化显示下,然后在详细说明一遍
docker run //运行一个docker容器
-d //已守护进行运行,也是所谓的持久化运行
-p 443:443 //把主机上的443端口映射到容器中的443端口
--restart=always //说白了就是开机启动
--name alex_registry //容器的显示名字
-v /opt/registry:/var/lib/registry //把镜像目录映射到主机上,使其上传的image文件可以持久化存储
-v /etc/pki/tls/certs:/certs //这是我们创建的SSL证书文件,映射到容器中
-v /opt/auth:/auth //创建的用户名密码用于登陆认证
-e REGISTRY_HTTP_ADDR=0.0.0.0:443 //设置容器内服务监听端口为443,不用这个可以使用
-d 443:5000 一样效果
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/self.crt //加载证书文件
-e REGISTRY_HTTP_TLS_KEY=/certs/self.key //加载KEY文件
-e "REGISTRY_AUTH=htpasswd" //设置认证方式
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Base Auth" //认证窗口的提示信息
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd //认证的配置文件
alex/registry-www.opskb.com //启动容器的images文件
这时候我们发现在push时,就需要提示输入信息,不是任何人都能push了
在pull的过程中我们也无法进行
为了方便我们需要首现登陆到registry上
Docker login http://192.168.150.200
当然我这里的证书有问题,我没有做相关的DNS解析,可以使用curl进行验证
curl --user alex:P@ssw0rd https://192.168.150.200/v2/_catalog -k
还是演示下怎么操作吧,这里我先在host文件里面添加一条记录,没有DNS
[root@registry auth]# vi /etc/hosts
192.168.150.200 registry.alex.com
测试下记录名是否正常访问
创建一个存放证书的目录
[root@registry opt]# mkdir certs
[root@registry opt]# cd certs/
使用openssl创建一个自签名证书
[root@registry certs]# openssl req -newkey rsa:2048 -nodes -sha256 -keyout domain.key -x509 -days 365 -out domain.crt
Generating a 2048 bit RSA private key
.............................+++
......................+++
writing new private key to 'domain.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:CN
State or Province Name (full name) []:bl
Locality Name (eg, city) [Default City]:bj
Organization Name (eg, company) [Default Company Ltd]:alex
Organizational Unit Name (eg, section) []:alex
Common Name (eg, your name or your server's hostname) []:registry.alex.com //注意这里填写我们的DNS名称,和访问的名字对应
Email Address []:alex@alex.com
停止以前的docker
[root@registry opt]# docker stop alex_registry
删除docker容器
[root@registry opt]# docker rm alex_registry
启动新的docker容器
[root@registry opt]#docker run -d -p 443:443 --restart=always -v /opt/registry:/var/lib/registry --name alex_registry -v /opt/certs:/certs -e REGISTRY_HTTP_ADDR=0.0.0.0:443 -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key -v /opt/auth:/auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Base Auth" -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd alex/registry-www.opskb.com
使docker信任我们的证书,该目录是我们需要手工创建registry.alex.com是镜像名
[root@registry certs]# cat domain.crt > /etc/docker/certs.d/registry.alex.com/ca.crt
测试
如果看到如下错误,说明docker不信任证书,和证书有问题
文章末尾固定信息
评论