Docker Registry https 部署

Eric 2018年07月05日 1,025次浏览

现在 Docker Registry 默认都启用 https 访问,虽然可以通过配置其他节点的 daemon.json 文件来使用 http 访问,但如此操作比较麻烦,且限制节点仓库地址。
在部署 Kubernetes 时,必须要有一个可以方便访问的仓库,于是参考网络资料,尝试搭建带证书的私有仓库并记录过程如下

openssl生成密钥文件

  1. 修改openssl配置文件,编辑/etc/pki/tls/openssl.cnf,在[ v3_ca ]下增加了一行:
[ v3_ca ]
subjectAltName=IP:192.168.1.6

192.168.1.6就是 Registry 所在的宿主机 IP
这个很重要,否则在后面会报registry endpoint...x509: cannot validate certificate for ... because it doesn't contain any IP SANs

  1. 生成密钥
openssl req -newkey rsa:4096 -nodes -sha256 -keyout certs/domain.key -x509 -days 365 -out certs/domain.crt

在证书的创建过程中,会询问国家、省分、城市、组织、部门和common name的信息,其中common name信息填写主机的IP 192.168.1.6

证书创建完毕后,在certs目录下出现了两个文件:

domain.key # 证书文件
domain.crt # 私钥文件

启动仓库加入证书

  1. 仓库启动命令
docker run -d \
 --restart=always \
 --name registry \
 -v /root/certs:/root/certs \
 -v /var/lib/registry:/var/lib/registry \
 -e REGISTRY_HTTP_ADDR=0.0.0.0:5000 \
 -e REGISTRY_HTTP_TLS_CERTIFICATE=/root/certs/domain.cert \
 -e REGISTRY_HTTP_TLS_KEY=/root/certs/domain.key \
 -p 5000:5000 \
 registry

可在浏览器访问:https://192.168.1.6:5000/v2 测试仓库是否可用。正常会返回{}

其他主机使用仓库

  1. 将第三步生成的密钥文件复制到需要使用仓库的主机上

在其他主机上创建目录mkdir -p /etc/docker/certs.d/192.168.1.6:5000

目录中 IP 端口即仓库地址

scp certs/domain.crt root@ht240:/etc/docker/certs.d/192.168.1.6:5000/ca.crt

无需重启docker服务即可使用私有仓库

仓库Web界面 Doceker Registry Web

docker-registry-web一个简单的仓库显示UI,只能显示不能做其他任何操作

docker run -d -p 9001:8080 --name registry-web \
           -e REGISTRY_URL=https://192.168.1.6:5000/v2 \
           -e REGISTRY_TRUST_ANY_SSL=true \
           -e REGISTRY_NAME=192.168.1.6:5000 \
		   hyper/docker-registry-web