Logo 📚 Digital Library

Docker Registry

 

适用场景:国内网络环境,官方 Docker Hub 镜像受限,想通过国外服务器自建代理 Registry 或做临时缓存。


1️⃣ 服务端部署#

1.1 创建数据目录#

选择服务器上一个适合存放 Registry 数据的目录(如 /opt/registry/data),并创建:

sudo mkdir -p /opt/registry/data

1.2 启动 Docker Registry 容器#

使用官方 registry:2 镜像,搭建一个代理模式的 Registry:

sudo docker run -d \
  -p 5000:5000 \
  --restart=always \
  --name registry \
  -v /opt/registry/data:/var/lib/registry \
  -e REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io \
  registry:2

说明:

  • -p 5000:5000:容器端口 5000 映射到宿主机。
  • REGISTRY_PROXY_REMOTEURL:开启代理模式,将请求转发到 Docker Hub。
  • --restart=always:服务器重启自动启动。
文章图片

💡 如果你不希望缓存,可在客户端 pull 之后直接清理 /opt/registry/data,或者直接忽略缓存(详见清理策略)。


2️⃣ Nginx 反向代理配置#

为了让客户端通过 HTTPS 安全访问 Registry,可用 Nginx 做反向代理。

2.1 创建 Nginx 配置文件#

假设域名 hub.850899.xyz

server {
    listen 443 ssl;
    server_name hub.850899.xyz;

    ssl_certificate /etc/ssl/850899.xyz/fullchain.pem;
    ssl_certificate_key /etc/ssl/850899.xyz/privkey.pem;

    location / {
        proxy_pass http://127.0.0.1:5000;
        proxy_set_header Host $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;
    }
}

server {
    listen 80;
    server_name hub.850899.xyz;
    return 301 https://$host$request_uri;
}

说明:

  • 代理 HTTPS 流量到本地 Docker Registry。
  • 自动跳转 HTTP 到 HTTPS。
  • 使用官方或自签 SSL 证书保证安全。

2.2 测试并重载 Nginx#

sudo nginx -t
sudo nginx -s reload

3️⃣ 数据清理与管理#

3.1 缓存清理策略#

如果你不想长期占用磁盘空间

  • 方法 1:每日定期清理/etc/cron.daily/registry-gc 创建脚本:
#!/bin/bash
docker exec registry registry garbage-collect /etc/docker/registry/config.yml
docker exec registry registry rm -f

然后设置可执行权限:

sudo chmod +x /etc/cron.daily/registry-gc
  • 方法 2:手动清理 pull 完镜像后,可直接删除缓存文件夹(例如 /opt/registry/data/docker/registry/v2/blobs),只保留需要的镜像即可。

⚠️ 注意:不要随意删除 _manifests_layers 中的文件,否则 Registry 数据可能损坏。


4️⃣ 客户端 Docker 配置#

4.1 修改 daemon.json#

在国内客户端机器上配置:

{
  "registry-mirrors": [
    "https://hub.littlediary.cn",
    "https://docker.m.daocloud.io"
  ],
  "insecure-registries": [
    "hub.850899.xyz:443"
  ]
}

说明:

  • registry-mirrors:官方 Docker Hub 镜像加速源。
  • insecure-registries:自建 Registry 或自签证书的 HTTPS Registry。
  • 支持未来追加新源,灵活扩展。

4.2 重启 Docker#

sudo systemctl daemon-reexec
sudo systemctl daemon-reload
sudo systemctl restart docker

4.3 测试 pull#

# 官方镜像走加速源
docker pull nginx:latest

# 自建 Registry
docker pull hub.850899.xyz/library/nginx:latest
文章图片

5️⃣ 使用场景与应用#

5.1 常见场景#

  1. 国内网络无法直接访问 Docker Hub
    • 服务器先在国外 pull 镜像
    • 国内客户端通过自建 Registry pull
  2. 缓存重要镜像,节省流量
    • 服务器可作为镜像中心
    • 客户端重复使用同一镜像无需再拉官方源

5.2 清理与维护#

  • 定期清理缓存:避免占用过多磁盘空间
  • 监控磁盘和带宽:尤其服务器存储有限
  • 灵活扩展源:新增官方加速或自建 Registry

6️⃣ 总结#

通过以上配置,你可以实现:

  • 国内客户端可安全访问 Docker 镜像,无需直连 Docker Hub。
  • 可以选择是否缓存镜像,灵活控制服务器磁盘占用。
  • 配置可扩展,方便未来新增加速源或 Registry。
  • 结合 Nginx,保证 HTTPS 安全访问。

💡 提示:对于个人使用,完全不缓存也是可行的,服务器只作为临时 pull 跳板即可,节省存储空间。