借助Nginx搭建Docker SSL Registry

搭建docker SSL验证仓库方式不止一种,但是不管你用哪种方式搭建,都必须要有证书和私钥证书,拿到(自签或者公认)证书后怎么搭建一个SSL验证的docker仓库。

假设我们的仓库域名是:www.dockerinfo.net

如果本地网络没有做好dns,则在本地/etc/hosts文件添加

127.0.0.1 www.dockerinfo.net

step 1: 启动一个http的docker registry

docker run --rm --name registry -p 5000:5000 -v /tmp/docker-registry:/var/lib/registry registry:2.4.0

测试:测试方式是直接访问/v2/,返回{}表示成功

curl http://127.0.0.1:5000/v2/

# {}%

step 2: 配置nginx

假设证书和秘钥的名字分别为:www.dockerinfo.net.crt,www.dockerinfo.net.key

都放在/etc/nginx/ssl目录下

sudo vim /etc/nginx/sites-enabled/www.dockerinfo.netm.conf
server{
    listen 443;
    server_name www.dockerinfo.net;

    ssl on;
    ssl_certificate /etc/nginx/ssl/www.dockerinfo.net.crt;
    ssl_certificate_key /etc/nginx/ssl/www.dockerinfo.net.key;

    location / {
        proxy_pass http://127.0.0.1:5000; # 方向代理到本地的registry
    }
}

配置完后reload一下

sudo nginx -s reload

测试一下

# www.dockerinfo.net.crt 就是和上面nginx使用的是同一个
curl https://www.dockerinfo.net/v2/ --cacert www.dockerinfo.net.crt

# {}%

没报证书验证失败错误,返回{}则表示通过

step 3: 分发证书到docker客户端

(使用公认证书的略过这一步)

按照docker的约定,自签证书需要把证书放在/etc/docker/certs.d

/etc/docker/certs.d下创建目录www.dockerinfo.net,目录名字也是有规定的,必须为$IP:$PORT格式,因为https默认就是443,我们仓库服务端打开的也是443端口,因此PORT可以缺省不写

# 创建证书存放目录
sudo mkdir -pv /etc/docker/certs.d/www.dockerinfo.net

# 拷贝证书到docker约定的目录下
sudo cp www.dockerinfo.net.crt /etc/docker/certs.d/www.dockerinfo.net/ca.crt

测试

此时的仓库服务端没有镜像,先做一个push动作,先从docker hub上拉取一下小镜像回来,用于测试

docker pull busybox
docker tag busybox www.dockerinfo.net/busybox

测试push推送镜像

docker push www.dockerinfo.net/busybox
#
# The push refers to a repository [www.dockerinfo.net/busybox]
# 5f70bf18a086: Pushed 
# 1834950e52ce: Pushed 
# latest: digest: sha256:9e19eb0c215b760dc7f268402ffe83cb0f063bbcbb181bc25d2d75a9531ea117 size: 733
#

推送成功

测试pull

# 先删除原本的www.dockerinfo.net/busybox镜像
docker rmi www.dockerinfo.net/busybox

# Untagged: www.dockerinfo.net/busybox:latest

docker pull www.dockerinfo.net/busybox

# Using default tag: latest
# latest: Pulling from busybox
#
# Digest: sha256:9e19eb0c215b760dc7f268402ffe83cb0f063bbcbb181bc25d2d75a9531ea117
# Status: Downloaded newer image for www.dockerinfo.net/busybox:latest

测试通过

用户名验证

如果要加入账户验证,则在nginx配置中,增加

location / {
    proxy_pass http://127.0.0.1:5000;
    auth_basic "Restricted";
    auth_basic_user_file /etc/nginx/.htpasswd;
}

生成.htpasswd文件

sudo htpasswd -c -b /etc/nginx/.htpasswd choldrim 123456

修改配置后reload一下

sudo nginx -s reload
# 直接拉取,发现失败了
docker pull www.dockerinfo.net/busybox

# Using default tag: latest
# Pulling repository www.dockerinfo.net/busybox
# unauthorized: authentication required


# 登录
docker login -u choldrim -p 123456 www.dockerinfo.net

# Login Succeeded


# 再次拉取
docker pull www.dockerinfo.net/busybox
# Using default tag: latest
# latest: Pulling from busybox
# Digest: 
# sha256:9e19eb0c215b760dc7f268402ffe83cb0f063bbcbb181bc25d2d75a9531ea117
# Status: Downloaded newer image for www.dockerinfo.net/busybox:latest
分享到:更多 ()