docker registry 2 with tls and basic authentication

今天安装docker registry, 并且加上tls证书和用户名密码登录

 

0. 准备两个vm:   node1, node2

    两个vm的 /etc/hosts加上   192.168.x.x  node1.org

    node1.org就是registry用的域名。

 

2020.6.27

node1上操作

1. 新建两个目录:  /opt/registry/certs, opt/registry/auth, 分别存放证书和用户密码文件

    取registry image: 

    # docker pull registry:2

2. 下载htpasswd

    因为新的registry没有htpasswd命令(是指运行的registry的容器里没有htpasswd,或许我没有找到),所以自己下载,这个不是在容器里运行,是在vm。

    然后用htpasswd生成用户名和密码文件

    # yum install httpd-tools -y

3. 生成htpasswd:
   # htpasswd -Bbn tom 12345678 > htpasswd
   前一个htpasswd是命令,后面一个htpasswd是生成的用户名密码文件,然后把这个密码文件htpasswd, 放到 /opt/registry/auth里

   (网上有很多是这样的: docker run --entrypoint htpasswd registry:2 -Bbn testuser password > auth/htpasswd

   这个命令行是指运行docker容器里的 htpasswd命令。但在我的vm上报错: "exec: \"htpasswd\": executable file not found in $PATH": unknown.

   或许原先的registry版本有这个命令,现在没有了。)


4. 生成证书和key:
   # openssl req -newkey rsa:4096 -nodes -sha256 -keyout registry.key -x509 -days 99999 -out registry.crt
   。。。
   common name: node1.org

   。。。

   不能只写node1, 最好后面加上.org, .com之类。不然docker push node1/alpine, 会认为往docker.io 上推。即使docker login node1也不行。

   但如果是docker push node1.org/alpine, 在docker login的情况下,就会往私有仓库上推。

 

   可以用这个命令查看证书:

    openssl x509 -in registry.crt -noout -text

 

    然后要将registry.key registry.crt 挪到 /opt/registry/certs

 


5. 启动registry

docker run -d -p 443:443
--restart=always
--name registry
-v /opt/registry/certs:/certs
-v /opt/registry/auth:/auth
-e REGISTRY_HTTP_ADDR=0.0.0.0:443
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/registry.crt
-e REGISTRY_HTTP_TLS_KEY=/certs/registry.key
-e REGISTRY_AUTH=htpasswd
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm"
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
registry:2


想要登录registry的docker(也就是node2):
1. 新建/etc/docker/certs.d/node1.org, 把node1的registry.crt copy到这个文件夹。
2. docker login node1.org
3. docker pull alpine
   docker tag alpine node1.org/alpine
   docker push node1.org/alpine
4. 其它的vm,也要有/etc/docker/certs.d/node1.org/registry.crt, 就可以 docker pull了。

浏览器访问:  https://192.168.x.x/v2/_catalog

 

总结一下:

域名要和证书的common name一样, 域名也要在/etc/hosts 解析。域名要有.com, .org之类的。

htpasswd 只要知道里面的用户名和密码,可以管别人要一个,或按上面的说明自己做一个。

** 防火墙要开 443

 

 

2020.9.12 加:

在华为云有个ecs, 想着用公网体验一下docker registry, 结果按上面弄,访问不了。网上又查了一遍,解决如下:

(核心思想就是证书里要加上registry的所在服务器的 IP)

生成私钥
# openssl genrsa -out registry.key 4096  

生成证书签名请求 Certificate Signing Request (CSR)
使用了 -subj, 就不会一行一行地问你了,CN: Common Name
# openssl req -new -key registry.key -subj "/CN=119.3.234.x" -out registry.csr  (119.3.234.x换成你自己的ip),

生成自签名证书:
要先准备一个extfile.cnf, 里面就一行内容:
subjectAltName = IP:119.3.234.x    (119.3.234.x换成你自己的ip),

# openssl x509 -req -days 9999 -in registry.csr -signkey registry.key -out registry.crt -extfile extfile.cnf
 

客户端docker:
同样,要在client边的docker下建一个目录/etc/docker/certs.d/119.3.234.x  (119.3.234.x换成你自己的ip),
把自签名的证书registry.crt放在里面。

posted @ 2020-06-27 02:12  北极熊129  阅读(445)  评论(0编辑  收藏  举报