查看原文
其他

Linux下Docker私有仓库2:配置TLS证书

李逸皓 运维book思议 2023-10-21

先放个链接,万一有人关注呢

优质文章推荐

↓ ↓ ↓ ↓ ↓

Linux系统监控工具推荐

CentOS再见!拥抱Rocky ro Alma

一文搞懂Linux下的神级编辑器:Vim

Docker常用命令总结:运维必知必会

Linux系统文本三剑客:Sed命令

如果需要Registry能够对外提供服务,就需要配置用户认可的TLS证书,否则将无法正常使用。目前有很多代理商可以提供权威的证书,用户可以自行选择。
下面将通过示例演示自行生成TLS证书的方式及过程。
1.使用Openssl工具生成私人证书文件,示例代码如下:
[root@Docker-1 ~]# mkdir -p /opt/Docker/registry/certs[root@Docker-1 ~]# openssl req -newkey rsa:4096 -nodes -sha256 -keyout /opt/Docker/registry/certs/domain.key -x509 -days 365 -out /opt/Docker/registry/certs/domain.crtGenerating a 4096 bit RSA private key.................................................++..............................................................................................................................................................+writing new private key to '/opt/Docker/registry/certs/domain.key'-----You are about to be asked to enter information that will be incorporatedinto 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 blankFor some fields there will be a default value,If you enter '.', the field will be left blank.-----Country Name (2 letter code) [XX]:CN#输入两个字符的国家名,例如:中国的为CNState or Province Name (full name) []:bj#输入省份名称Locality Name (eg, city) [Default City]:bj#输入城市名称Organization Name (eg, company) [Default Company Ltd]:#输入公司名称Organizational Unit Name (eg, section) []:#输入部门名称Common Name (eg, your name or your server's hostname) []:registry.Docker.com#姓名,通常指证书名称Email Address []:#电子邮箱地址
上述示例中,首先创建存放证书的路径,在生成证书时,须要填写相关信息,例如地址、姓名等。
1.创建带有TSL认证的registry容器,示例代码如下:
[root@Docker-1 ~]# docker run -it -d \ > --name registry-TLS \ > -p 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 6f4f8bbc439201d318140726da8a294f1820c194260f256f9d1311fce6797d3c
上述示例中,运行了一个命名为registry-TLS的容器并通过REGISTRY_HTTP_TLS_CERTIFICATE和REGISTRY_HTTP_TLS_KEY两个参数启用registry的证书支持。
2.在每一台Docker客户端宿主机上配置域名解析,以便宿主机可以解析域名“registry.Docker.com”,并在宿主机中创建与域名名称相同的目录,示例代码如下:
[root@Docker-1 ~]# cat /etc/hosts 192.168.56.146 registry.Docker.com [root@Docker-2 ~]# cat /etc/hosts 192.168.56.146 registry.Docker.com #两台机器均已做好解析 [root@Docker-2 ~]# mkdir /etc/Docker/certs.d [root@Docker-2 ~]# cd /etc/Docker/certs.d/ [root@Docker-2 certs.d]# mkdir registry.Docker.com:5000
3.将证书damain.crt复制到要使用registry的Docker宿主机,并放到/etc/Docker/certs.d/registry.Docker.com:5000/目录下,示例代码如下:
[root@Docker-1 ~]# scp -r -p /opt/Docker/registry/certs/domain.crt \> 192.168.56.147:/etc/Docker/certs.d/registry.Docker.com:5000/ca.crtroot@192.168.56.147's password: domain.crt 100% 2000 1.1MB/s 00:00 [root@Docker-2 certs.d]# ls registry.Docker.com\:5000/ca.crt
4.Docker-1是registry的宿主机,下面使用Docker-2推送镜像到私有仓库,示例代码如下:
[root@Docker-2 ~]# docker tag busybox:latest registry.Docker.com:5000/busybox:latest[root@Docker-2 ~]# docker push registry.Docker.com:5000/busybox:latestThe push refers to repository [registry.Docker.com:5000/busybox]0b97b1c81a32: Pushed latest: digest: sha256:f79f7a10302c402c052973e3fa42be0344ae6453245669783a9e16da3d56d5b4 size: 527[root@Docker-2 ~]# curl -X GET https://registry.Docker.com:5000/v2/_catalog -k{"repositories":["busybox"]}
上述示例中,成功将Docker-2中的镜像推送至私有仓库,并通过-k选项关闭curl对证书的验证。
注意,默认情况下,证书只支持基于域名访问,要使其支持IP地址访问,需要修改配置文件Openssl.cnf。在Centos7系统中,文件所在位置是/etc/pki/tls/Openssl.cnf,在文件中的[ v3_ca ]部分,添加subjectAltName选项,示例代码如下:
[root@Docker-1 ~]# vim /etc/pki/tls/Openssl.cnf[ v3_ca ]subkectAltName = IP:192.168.56.146
保存退出后,重新生成证书即可使用。
在企业内部创建私有镜像仓库时,为防止信息泄露,通常会为仓库添加访问限制。实现访问限制的最简单的方法是通过基本身份验证,本小节将通过本机基本身份验证,做对仓库的访问限制。
1.创建用户密码文件,示例代码如下:
[root@Docker-1 ~]# mkdir /opt/Docker/registry/auth[root@Docker-1 ~]# docker run --entrypoint htpasswd registry -Bbn testuser testpassword > /opt/Docker/registry/auth/htpasswd
上述示例中,创建了用户密码文件testuser与testpassword。
2.运行仓库容器,并指定TLS证书与身份验证目录,示例代码如下:
[root@Docker-1 ~]# docker run -d -it \> --name registry-auth \> -p 5000:5000 \> -v /opt/Docker/registry/auth/:/auth \> -e "REGISTRY_AUTH=htpasswd" \> -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \> -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \> -v /opt/Docker/registry/certs:/certs \> -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \> -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key registryfc1df62e3e252a9cdcf1efad1a30db71b71e4b683f256649537863c15cba14ae
3.尝试推送镜像,示例代码如下:
[root@Docker-2 ~]# docker push 192.168.56.146:5000/busyboxThe push refers to repository [192.168.56.146:5000/busybox]0b97b1c81a32: Preparing no basic auth credentials
上述示例中,镜像推送失败,原因是没有基本身份验证凭据。
4.通过用户名与密码登陆,示例代码如下:
[root@Docker-2 ~]# docker login registry.Docker.com:5000Username: testuserPassword: Login Succeeded
5.登陆之后,再次推送镜像,示例代码如下:
[root@Docker-2 ~]# docker tag busybox:latest registry.Docker.com:5000/busybox[root@Docker-2 ~]# docker push registry.Docker.com:5000/busyboxThe push refers to repository [registry.Docker.com:5000/busybox]0b97b1c81a32: Pushed latest: digest: sha256:f79f7a10302c402c052973e3fa42be0344ae6453245669783a9e16da3d56d5b4 size: 527
上述示例中,在登陆之后成功推送镜像到私有仓库。

未完待续。。。。。。

来不及解释了,快上车!(进群看公告)

欢迎新的小伙伴加入!在这里,我们鼓励大家积极参与群内讨论和交流,分享自己的见解和经验,一起学习和成长。同时,也欢迎大家提出问题和建议,让我们不断改进和完善这个平台。

                  ↓↓↓ 点个在看,你最好看!

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存