Docker Registry 是 docker 官方提供的工具,可以用于构建私有的镜像仓库,下面将介绍如何使用 Docker Registry 来搭建属于自己的私有仓库。
  1. 安装运行 docker-registry

    默认情况下,仓库会被创建在容器的/var/lib/registry目录下,你可以通过-v参数来将镜像文件存放在本地的指定路径。

    docker run -d -p 127.0.0.1:5000:5000 -v /local_dir:/docker_dir registry
    

    对应的docker-compose up -d方式配置(docker-compose.yml)

    version: '3'
    
    services:
      registry:
        image: registry:latest
        ports:
          - "5000:5000"
        volumes:
          - /local_dir:/docker_dir
        environment:
          REGISTRY_HTTP_HOST: https://docker.kyzy.cc
          REGISTRY_AUTH: htpasswd
          REGISTRY_AUTH_HTPASSWD_PATH: /docker_dir/auth.password
          REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
    
  2. 安装 nginx(用于反向代理),apache2-utils(用于生成 basic auth 验证文件)

    apt install nginx apache2-utils
    
  3. 证书生成

    证书可以使用 CloudFlare 的也可以自己生成

  4. 配置 nginx

    server {
        error_log /var/log/nginx/error_docker.log;
        access_log /var/log/nginx/access_docker.log;
        listen       443 ssl http2;
        listen       [::]:443 ssl http2;
        server_name  docker.mydomain.com;
    
        auth_basic "登录"; ### <--- 要求验证
        auth_basic_user_file /etc/nginx/auth.password; ### <--- 保存验证信息
    
        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;
    
        location ^~ /.well-known/acme-challenge/ {
            alias /var/www/html/ssl_check_file/;
        }
    
        ssl_certificate     /root/docker-nginx-test/mydomain.com.pem; ### <--- 证书 key
        ssl_certificate_key /root/docker-nginx-test/mydomain.com.key; ### <--- 证书
    
        location / {
            proxy_set_header    X-Real-IP               $remote_addr;
            proxy_set_header    X-Forwarded-For         $proxy_add_x_forwarded_for;
            proxy_set_header    HTTP_X_FORWARDED_FOR    $remote_addr;
    
            proxy_pass http://127.0.0.1:5000; ### <--- 反向代理
        }
    
        error_page 404 /40x.html;
            location = /40x.html {
        }
    
        error_page 500 502 503 504 /50x.html;
            location = /50x.html {
        }
    }
    
  5. 应用

    1. 登录 docker 仓库

      docker login docker.mydomain.com
      
    2. 标记想要推送的镜像

      # 格式 docker tag IMAGE[:TAG] [REGISTRY_HOST[:REGISTRY_PORT]/]REPOSITORY[:TAG] 例如:
      docker tag my-docker-image:v1.0 docker.mydomain.com/my-docker-image:v1.0
      
    3. 上传标记的镜像

      docker push docker.mydomain.com/my-docker-image:v1.0
      
    4. 拉取仓库中的镜像

      docker pull docker.mydomain.com/my-docker-image:v1.0
      
    5. 用 curl 查看仓库中的镜像。

      curl -u username:password https://docker.mydomain.com/v2/_catalog

      或者

      curl -u username:password https://docker.mydomain.com/v2/my-docker-image/tags/list