docker registry 2 with tls and basic authentication

一世为白 2020-06-27

今天安装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 -<span>in registry<span>.crt -noout -text</span></span>


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了。


总结一下:

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

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

相关推荐