搭建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
评论前必须登录!
注册