Docker registry + Nginx反向代理 + SSL + htpasswd用户验证
Docker私服仓库功能:
- 镜像管理:由docker-registry实现,通过http服务来上传下载
- 用户认证:Nginx实现http请求管理+htpasswd用户验证
环境准备
服务器操作系统serverA:CentOS7.3,用于搭建docker registry仓库
本地docker环境clientB:Docker version 20.10.5
一、【Docker Registry】是一个Docker镜像,用于搭建私有测试仓库
# 1、serverA上安装并启动docker
# 2、拉取registy镜像
docker pull registry
# 3、运行。 Registry服务默认会将上传的镜像保存在容器的/var/lib/registry,将主机的/opt/registry目录挂载到该目录
docker run -d --name myregistry -p 5000:5000 \
--privileged=true --restart=always \
-v /opt/registry:/var/lib/registry registry
# 4、增加阿里云安全组开发5000端口
# 增加防火墙开放5000端口
# 访问http://ip_add:5000/v2/,验证容器启动正常
##### 测试
# 5、重新tag本地的镜像,准备要提交的版本
docker tag demo-docker:1.0 ip:port/demo-docker:1.0
# 6、上传镜像到registry私有仓库(失败)
docker push ip:port/demo-docker:1.0
第六步会失败,因为我们启动的registry服务不是安全可信赖的,Docker从1.3.x之后与仓库交互需要https访问。解决方案有两种:
- 第一种,将本地clientB的访问策略改成允许http
sudo vim /etc/docker/daemon.json
{"insecure-registries":["10.10.8.160:8082"]}
systemctl daemon-reload
sudo systemctl restart docker.service- 第二种,将serverA上搭建的registry用Nginx反向代理https访问
二、Nginx配置https反向代理5000端口的registry,并提供用户名/密码验证机制
1、配置https, 参考《nginx配置https》
2、提供用户名/密码验证机制
# 新建秘钥文件目录和使用htpasswd生成登录用户
mkdir /usr/local/nginx/auth
touch /usr/local/nginx/auth/htpasswd.txt
3、nginx配置文件如下
touch /usr/local/nginx/conf/conf.d/docker-registry.conf
-------------------------------------------
upstream docker-registry {
server 10.10.225.117:5000;
}
server {
listen 8443 ssl;
server_name kxy.cn;
ssl_certificate /usr/local/nginx/cert/cert.pem;
ssl_certificate_key /usr/local/nginx/cert/cert.key;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
client_max_body_size 0;
chunked_transfer_encoding on;
add_header 'Docker-Distribution-Api-Version' 'registry/2.0' always;
location / {
auth_basic "Restricted";
auth_basic_user_file /usr/local/nginx/auth/htpasswd.txt;
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_read_timeout 900;
proxy_pass http://docker-registry;
}
location /_ping {
auth_basic off;
proxy_pass http://docker-registry;
}
location /v2/_ping {
auth_basic off;
proxy_pass http://docker-registry;
}
location /v2/_catalog {
auth_basic off;
proxy_pass http://docker-registry;
}
}
-----------------------------------------------------------
# 重新加载nginx配置文件
nginx -s reload
4、测试访问:
镜像列表:https://www.iray-dataset.com:8443/v2/_catalog
镜像版本列表:https://www.iray-dataset.com:8443/v2/iray-robot-manager/tags/list
输入用户名密码若可以访问成功,则说明配置nginx通过https反向代理docker registry是成功的
5、客户端登录docker远程仓库
自签名证书需要配置本地系统信任CA证书和docker信任证书参考链接
- 配置本地系统信任CA证书
#CentOS 6/7中bundle文件的位置:/etc/pki/tls/certs/ca-bundle.crt
#Ubuntu/Debian中Bundle文件的位置:/etc/ssl/certs/ca-certificates.crt
cat server.crt >> /etc/ssl/certs/ca-certificates.crt- docker信任证书
#将server.crt拷贝到 /etc/docker/certs.d/[docker_registry_domain]/server.crt
cp server.crt /etc/docker/certs.d/kxy.cn/ca.crt
# 客户端Docker重启
systemctl restart docker
# 客户端测试登陆Docker私服仓库
docker login https://www.iray-dataset.cn:8443 -u admin -p 123456
# 查看登录信息
cat ~/.docker/config.json
三、实验测试
通过bushbox测试push镜像到搭建的私服registry
# 拉取
docker pull busybox
# tag
docker tag busybox:latest www.iray-dataset.cn:8443/busybox:v1
# push
docker push www.iray-dataset.cn:8443/busybox:v1
四、Registry Web UI搭建web页面管理serverA的镜像
docker search dockerfly
docker pull registry.cn-hangzhou.aliyuncs.com/voovan/dockerfly:20170227
# 打tag 查看镜像是否拉取成功,镜像名太长
docker tag registry.cn-hangzhou.aliyuncs.com/voovan/dockerfly:20170227 dockerfly
# 启动镜像(镜像-容器-运行)
docker run --name dockerfly --restart=always -d -v /var/run/docker.sock:/var/run/docker.sock -p 2735:2735 -p 28083:28083 dockerfly
# 浏览器访问 http://dockerserviceip:28083 可以看到我们所以镜像的状态
Q.E.D.