前言

为什么需要自建Registry?

自建Docker Registry的主要目的是为了解决Docker Hub无法访问,从而无法拉取镜像的问题。国内提供的加速源或者镜像站良莠不齐,且很多大站已经停止维护且无法访问,因此自建Registry是解决镜像问题的方案之一。

准备

  1. 海外VPS主机/应用服务器;
  2. 域名(可选);
  3. registry、caddy的compose.yaml及caddy配置文件;

docker-compose.yaml

# docker-compose.yml
version: '3.8'
services:
  # Caddy 反向代理
  caddy:
    image: caddy:2-alpine
    container_name: registry-caddy
    ports:
      - "80:80"    # HTTP 端口(用于 ACME 挑战)
      - "443:443"  # HTTPS 端口
    volumes:
      - ./Caddyfile:/etc/caddy/Caddyfile
      - ./caddy/data:/data
      - ./caddy/config:/config
      - ./caddy/logs:/var/log/caddy
    environment:
      - CADDY_DOMAIN=registry.seamory.com
    networks:
      - registry-net
    restart: unless-stopped

  registry:
    image: registry:2
    container_name: mirror-registry
    #ports:
    #  - "5000:5000"
    environment:
      # 上游docker hub地址
      REGISTRY_PROXY_REMOTEURL: https://index.docker.io
      # 保存路径;
      REGISTRY_STORAGE_FILESYSTEM_ROOTDIRECTORY: /data
      # 启用缓存;
      CACHE_SIZE: "20gb"
      CACHE_TTL: "30d"
      # 建议对registry启用访问鉴权,否则任何人都可以通过该registry地址下载docker镜像;
      REGISTRY_AUTH: htpasswd
      REGISTRY_AUTH_HTPASSWD_REALM: Registry Realm
      REGISTRY_AUTH_HTPASSWD_PATH: /auth/htpasswd
    volumes:
      - ./registry-data:/data
      - ./auth:/auth
    networks:
      - registry-net
    restart: unless-stopped

networks:
  registry-net:
    driver: bridge

Caddyfile

# Caddyfile
# 替换 your-domain.com 为你的实际域名
registry.seamory.com {
    # 如果没有域名,则启用ip自签发证书
    # tls internal

    # 反向代理到 Registry
    reverse_proxy registry:5000

    # 可选:添加日志
    log {
        output file /var/log/caddy/registry.log
    }
}

# 可选:添加重定向(HTTP -> HTTPS)
#registry.seamory.com {
#    redir https://registry.seamory.com{uri}
#}

步骤

1. 配置防火墙。

2. 安装Docker CE。

3. 创建并进入/opt/docker/registry目录,并在该目录中创建registry-compose.yaml以及Caddyfile

为什么需要Caddy?默认的Docker只会请求https协议的registry地址,否则需要修改daemon.json。Caddy可以默认为registry生成https所需要的证书,如果有自己的证书,可以不适用Caddy直接在registry的compose配置中添加自己的证书。

4. 在目录中执行docker compose -f registry-compose.yaml up -d运行regsitry和caddy。

5. 浏览器中输入https://<your-domain.com>/v2,检查是否能正常访问,应该会返回一个空对象:{};

6. 直接使用<your-domain.com>/<镜像>:<版本>进行镜像拉取,镜像和版本可以在docker hub中查询,拉取完成后,通过https://<your-domain.com>/v2可以看到已经缓存的镜像信息。如果配置了鉴权,则需要先执行docker login <your-domain.com>登录;