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 -<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 只要知道里面的用户名和密码,可以管别人要一人,或按上面的说明自己做一个。