天下之事,必先处之难,而后易之。
君临
知我者谓我心忧,不知我者谓我何求

原文地址:https://www.cnblogs.com/big-cousin/p/10142352.html

 


一:实验环境以及需求

实验环境:两台cnetos7.2版本虚拟机。(资源允许最好准备三台,一台做私有仓库,一台做上传镜像服务器,一台做下载镜像服务器)

虚拟机1:192.168.1.200 

虚拟机2:192.168.1.201

服务器防火墙和selinux关闭。hosts根据实际情况做解析,每台都需要解析。

本实验hosts解析为:192168.1.201 hub.com

此文档默认在Registry上操作,client上操作时会红色标记。

二:自建证书CA

要实现ssl认证就需要证书支持,证书最好是服务商提供的证书,比如阿里云,腾讯云等等。这里由于做实验,使用自建证书。

回到顶部

官方文档得知需要实验ssl认证,只需要.key 和 .crt。

创建.key和.crt

openssl req -newkey rsa:2048 -nodes -sha256 -keyout /docker/cert/ca.key -x509 -days 365 -out /docker/cert/ca.crt
复制代码
Country Name (2 letter code) [AU]:CN                                 #国家代码,中国CN
State or Province Name (full name) [Some-State]:Sichuan              #省份全拼
Locality Name (eg, city) []:Chengdu                                  #城市
Organization Name (eg, company) [Internet Widgits Pty Ltd]:registry  #组织名,公司名
Organizational Unit Name (eg, section) []:CA                         #部门名称
Common Name (e.g. server FQDN or YOUR name) []:hub.com          #这里必须填写Docker Registry使用的域名
Email Address []:admin@domain.com                                    #电子邮件
复制代码

三:ssl认证

1:将ca.crt内容放入系统的CA bundle文件当中,使操作系统信任我们的自签名证书。然后重启docker

CentOS 6 / 7中bundle文件的位置在/etc/pki/tls/certs/ca-bundle.crt 

cat /docker/cert/ca.crt >> /etc/pki/tls/certs/ca-bundle.crt  
systemctl restart docker

 

2:使用Docker Registry的Docker机需要将ca.crt拷贝到 /etc/docker/certs.d/[docker_registry_domain]/ca.crt

mkdir /etc/docker/certs.d/hub.com/              #client上执行
scp  /docker/cert/ca.crt  192.168.1.200:/etc/docker/certs.d/hub.com/  #registry 上执行。cat /docker/cert/ca.crt >> /etc/pki/tls/certs/ca-bundle.crt  #client上执行

3:Registry端和client端重启docker。

systemctl restart docker

四:启动Registry

1:启动

docker run -d -p 5000:5000 --restart=always --name registry \
    -v /registry:/var/lib/registry \
    -v `pwd`/cert/:/certs \
    -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/ca.crt \
    -e REGISTRY_HTTP_TLS_KEY=/certs/ca.key \
    -e REGISTRY_STORAGE_DELETE_ENABLED=true \
    registry

 解释:将宿主机的cert/目录映射到容器中的/certs目录中。指定registry启动使用/certs中的证书。`pwd` :当前目录,也可以使用绝对路径:/docker/cert/

2:浏览器验证

没使用证书的时候时走的http,使用证书后走的是https。

3:client端上传镜像验证(5000/db:2.0

docker push hub.com:5000/db:2.0

  

五:访问限制

回到顶部

通过basic authentication 实现简单的访问限制。

1:创建用户名和密码文件

1
2
3
cd /docker
mkdir auth
docker run --entrypoint htpasswd registry:2 -Bbn testuser testpassword > auth/htpasswd

  注:红色部分需改为你的用户名和密码

2:使用密码文件启动registry

docker run -d -p 5000:5000 --restart=always --name registry \
  -v /registry:/var/lib/registry \
  -v `pwd`/auth:/auth \
  -e "REGISTRY_AUTH=htpasswd" \
  -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
  -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  -v `pwd`/cert:/certs \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/ca.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/ca.key \
  -e REGISTRY_STORAGE_DELETE_ENABLED=true \
  registry:2

  注:如果你registry正在运行,需要关闭。由于加了参数--restart=always,当你关闭registry容器时,会自动重启registry容器,所以只有使用 docker rm -f registry 强制删除registry容器。

3:浏览器验证

 

使用你刚刚创建的用户和密码就可以登录了。

4:client验证(5000/db:3.0

docker push hub.com:5000/db:3.0

  

由于没有登录刚刚的账户,所以没有权限上传。

通过用户登录

docker login hub.com:5000
docker push hub.com:5000/db3.0

  

六:总结

1:用参数`pwd`时一定要注意启动时的目录是否对应。

2:删除registry'容器时记得删除挂载卷,不然上传的镜像还存在。docker stop registry && docker rm -v registry

3:访问失败时查看容器日志:docker logs registry -f       加上-f  实时查看。

posted on 2022-03-02 11:45  boonya  阅读(506)  评论(0编辑  收藏  举报

我有佳人隔窗而居,今有伊人明月之畔。
轻歌柔情冰壶之浣,涓涓清流梦入云端。
美人如娇温雅悠婉,目遇赏阅适而自欣。
百草层叠疏而有致,此情此思怀彼佳人。
念所思之唯心叩之,踽踽彳亍寤寐思之。
行云如风逝而复归,佳人一去莫知可回?
深闺冷瘦独自徘徊,处处明灯影还如只。
推窗见月疑是归人,阑珊灯火托手思忖。
庐居闲客而好品茗,斟茶徐徐漫漫生烟。

我有佳人在水之畔,瓮载渔舟浣纱归还。
明月相照月色还低,浅近芦苇深深如钿。
庐山秋月如美人衣,画堂春阁香气靡靡。
秋意幽笃残粉摇曳,轻轻如诉画中蝴蝶。
泾水潺潺取尔浇园,暮色黄昏如沐佳人。
青丝撩弄长裙翩翩,彩蝶飞舞执子手腕。
香带丝缕缓缓在肩,柔美体肤寸寸爱怜。
如水之殇美玉成欢,我有佳人清新如兰。
伊人在水我在一边,远远相望不可亵玩。