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.


行走在天地间自由的灵魂