今天安装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放在里面才能问题。