google/baidu上上有很多快速搭建Docker Registry的文章,都无法绕开认证问题,解决方法其实都是work around的采用–insecure-registry选项,也就是通过不使用安全的HTTPS-TLS方式来暂时绕过这个问题。
完美主义者不能接受这样的结果。我们要么不搭private registry要搭建就是得是完整的直接可以push的。
1,获取证书
Let’s Encrypt 是目前我觉得最好的免费证书。申请也十分容易直接命令行操作即可。要求就是有公网的IP,liunux系统,有域名,这些个我相信对于大多数想将retistry暴露在公网来使用的人来说不是问题。
获取证书
git clone https://github.com/letsencrypt/letsencrypt.git cd letsencrypt sudo ./letsencrypt-auto certonly
这里使用certonly代表我们只是去获取证书而不安装。
这是一个交互的过程
./letsencrypt-auto certonly Saving debug log to /var/log/letsencrypt/letsencrypt.log
How would you like to authenticate with the ACME CA? - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 1: Spin up a temporary webserver (standalone) 2: Place files in webroot directory (webroot) - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 1 Plugins selected: Authenticator standalone, Installer None Please enter in your domain name(s) (comma and/or space separated) (Enter 'c' to cancel): domain.com
第一处选择standlone,代表没有实际的网站在运行,80和443端品是非服务状态。
第二处写自己的域名,在后面的过程中letsencrypt会访问这个域名的80和443端口,如果有response则会报错。
生成的证书文件会在/etc/letsencrypt/archive/[domain]/
共生成4个文件
ls /etc/letsencrypt/archive/domain.com/ cert1.pem chain1.pem fullchain1.pem privkey1.pem
2,搭建registry
mkdir -p registry/data mkdir -p registry/certs
首先把刚生成的证书文件fullchain1.pem和privkey1.pem复制出来,并重命令到registry的certs目录
cp /etc/letsencrypt/archive/domain.com/fullchain* registry/certs/domain.com.crt cp /etc/letsencrypt/archive/domain.com/privkey* registry/certs/domain.com.key
编写docker-compose.yml
version: "3.7" services: registry: image: registry:2.7.1 restart: always container_name: registry environment: - REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.com.crt - REGISTRY_HTTP_TLS_KEY=/certs/domain.com.key ports: - "5000:5000" volumes: - $PWD/registry/data/:/var/lib/registry:rw - $PWD/registry/certs:/certs:ro
执行docker-compose创建image和container
docker-compose up -d
3,验证
openssl s_client -showcerts -verify 32 -connect domain.com:5000
没有任何error字样即为OK
然后就可以push了~ ^_^