Skip to content

自建Docker镜像加速器

Registry配合nginx反向代理方案

整体的思路:在nginx上实现basic认证,通过nginx反向代理到私有仓库中。

为什么不直接使用私有仓库的认证

一个原因是可以避免携带端口,另外一个原因是nginx反向代理到私有仓库后,认证会失败。docker login可以直接适用于nginx的basic auth。

registry代理模式介绍

Docker Registry 的代理模式(Proxy Mode)是一种特殊的运行模式,它允许本地 Registry 作为 Docker Hub 的代理服务器。这种模式的主要特点和优势包括:

  1. 镜像缓存:当客户端请求镜像时,Registry 会首先检查本地是否已缓存该镜像。如果存在,则直接返回;如果不存在,则从 Docker Hub 拉取并缓存。
  2. 加速访问:通过本地缓存,可以显著减少从 Docker Hub 拉取镜像的时间,特别是在网络条件不佳的情况下。
  3. 带宽节省:多个客户端请求相同镜像时,只需要从 Docker Hub 拉取一次,后续请求都从本地缓存获取。
  4. 离线支持:一旦镜像被缓存,即使 Docker Hub 暂时无法访问,本地客户端仍然可以拉取已缓存的镜像。
  5. 配置简单:只需要通过环境变量 REGISTRY_PROXY_REMOTEURL 指定上游 Registry 地址即可启用代理模式。

Docker Compose部署

创建 docker-compose.yml 文件:

yaml
services:
  registry:
    image: registry:2
    container_name: registry
    restart: always
    ports:
      - "5000:5000"
    environment:
      - REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io
      - REGISTRY_AUTH=htpasswd
      - REGISTRY_AUTH_HTPASSWD_REALM=Registry
      - REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd
    volumes:
      - ./registry-data:/var/lib/registry  # 持久化存储镜像数据
      - ./auth:/auth

启动服务:

bash
docker-compose up -d

登录:

docker login http://localhost:5000

验证服务:

bash
curl http://localhost:5000/v2/_catalog

nginx反向代理

nginx添加一个反向代理,转发到私有registry:

nginx
location ^~ / {
    proxy_pass http://localhost:5000;
    proxy_set_header Host localhost;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Real-Port $remote_port;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-Host $host;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header REMOTE-HOST $remote_addr;
    
    proxy_connect_timeout 60s;
    proxy_send_timeout 600s;
    proxy_read_timeout 600s;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection $connection_upgrade;
}

然后在nginx上加上Basic Auth认证即可。

纯Nginx反向代理缓存方案

使用Nginx作为Docker Registry的反向代理,实现镜像缓存加速。

安装配置

安装Nginx

bash
sudo apt install nginx

配置Nginx代理

创建 /etc/nginx/conf.d/docker-registry.conf

nginx
proxy_cache_path /var/cache/nginx/docker levels=1:2 keys_zone=docker:10m inactive=60m use_temp_path=off;

server {
    listen 443 ssl;
    server_name your.domain.com;

    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;

    location / {
        proxy_pass https://registry-1.docker.io;
        proxy_set_header Host registry-1.docker.io;
        proxy_cache docker;
        proxy_cache_valid 200 302 60m;
        proxy_cache_valid 404 1m;
    }
}

重启Nginx

bash
sudo systemctl restart nginx

客户端配置

修改/etc/docker/daemon.json,添加配置:

json
{
  "registry-mirrors": ["https://domain"]
}

执行docker login登录后即可使用私有的镜像仓库进行加速。