Docker registry V2 一些详细配置说明

  • A+
所属分类:技术分享

在前面的版本中我们我们快速的启动了一个我们自己的私有registry

V2版本
https://www.opskb.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

110717 0751 Dockerregis1 - Docker registry V2 一些详细配置说明

验证下

110717 0751 Dockerregis2 - Docker registry V2 一些详细配置说明

 
 

上传下载一样正常进行

110717 0751 Dockerregis3 - Docker registry V2 一些详细配置说明

 
 

有时候为了安全、我们的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

 

110717 0751 Dockerregis4 - Docker registry V2 一些详细配置说明

 
 

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]#

110717 0751 Dockerregis5 - Docker registry V2 一些详细配置说明

 
 

在进一步操作,设置为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了

110717 0751 Dockerregis6 - Docker registry V2 一些详细配置说明

 
 

在pull的过程中我们也无法进行

110717 0751 Dockerregis7 - Docker registry V2 一些详细配置说明

 
 

为了方便我们需要首现登陆到registry上

Docker login http://192.168.150.200

当然我这里的证书有问题,我没有做相关的DNS解析,可以使用curl进行验证

110717 0751 Dockerregis8 - Docker registry V2 一些详细配置说明

 
 

curl --user alex:P@ssw0rd https://192.168.150.200/v2/_catalog -k

110717 0751 Dockerregis9 - Docker registry V2 一些详细配置说明

 
 

还是演示下怎么操作吧,这里我先在host文件里面添加一条记录,没有DNS

[root@registry auth]# vi /etc/hosts

192.168.150.200 registry.alex.com

测试下记录名是否正常访问

110717 0751 Dockerregis10 - Docker registry V2 一些详细配置说明

创建一个存放证书的目录

[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

测试

110717 0751 Dockerregis11 - Docker registry V2 一些详细配置说明

如果看到如下错误,说明docker不信任证书,和证书有问题

110717 0751 Dockerregis12 - Docker registry V2 一些详细配置说明

 
 

 
 

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: