使用docker-compose快速搭建安全的私有Secure Registry

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了~ ^_^

Mac OSX清除dns缓存

每当更新dnspod中的域名解析信息后,macbook ping的返回总还是原IP,但发现的机器已经解析正常了,原因是osx有dns缓存

使用以下命令可以解决:

sudo killall -HUP mDNSResponder;say DNS cache has been flushed