8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png
0
0
0

基于 Hugging Face + Cloudflare 的高可用Docker Hub镜像源方案

雷顿
1天前 61

基于 Hugging Face + Cloudflare 的高可用Docker Hub镜像源方案

 
 

1. 痛点与背景

目前主流的 Docker 镜像加速方案多是基于 Cloudflare Workers/Pages 的直接反向代理(例如 cmliu/CF-Workers-docker.io)。

然而,随着 Docker Hub 对匿名拉取限制的收紧,纯 CF 方案面临严重的速率限制 (Rate Limiting) 问题:

  • IP 连坐机制: Docker Hub 对 Cloudflare 的泛播 IP 段(Anycast IP)实施了严格的限流。由于大量用户共享 CF 出口 IP,即使你个人的拉取频率很低,也经常会遇到以下报错:

Error response from daemon: error from registry: You have reached your unauthenticated pull rate limit.

  • 匿名拉取限制: 纯转发模式通常无法安全地注入认证信息,导致请求被视为“匿名用户”,触发 100 次/6小时 的严格限制(甚至针对 CF IP 更低)。

2. 解决方案架构

本方案引入 Hugging Face Space 作为中间层,构建 Pull-Through Cache (直通缓存)

架构拓扑: Client -> Cloudflare (入口/路由) -> Hugging Face (上游/认证) -> Docker Hub (源)

核心优势:

  1. 洗白 IP: 请求由 Hugging Face 的服务器(通常是 AWS 基础设施)向 Docker Hub 发起,避开了 Cloudflare 的“高风险”IP 段。
  2. 服务端强制认证: 在 HF 端通过环境变量注入 Docker Hub 账号,将所有下游的匿名请求转换为上游的已认证请求,享受更高的速率限制(免费账号 200次/6小时,Pro 账号无限)。
  3. 抗干扰: 前端 Cloudflare 绑定自定义域名,解决本地 SNI 阻断问题。

3. 后端部署 (Hugging Face)

利用 HF Space 运行官方 Registry 容器,作为带认证的上游代理。

  1. 创建 Space (SDK 选择 Docker, Visibility 选择 Public)。
  2. 新建 Dockerfile
FROM registry:2 USER root # 端口配置 ENV REGISTRY_HTTP_ADDR=:7860 EXPOSE 7860 # 开启 Proxy 模式 (指向官方源) ENV REGISTRY_PROXY_REMOTEURL=https://registry-1.docker.io # 注入认证信息 (核心步骤) # 这一步将匿名流量转换为认证流量,彻底解决 Rate Limit 问题 ENV REGISTRY_PROXY_USERNAME=${DOCKER_USER} ENV REGISTRY_PROXY_PASSWORD=${DOCKER_PASSWORD} # 允许删除 (可选) ENV REGISTRY_STORAGE_DELETE_ENABLED=true # 权限修正 RUN mkdir -p /var/lib/registry && \ chmod -R 777 /var/lib/registry CMD ["/etc/docker/registry/config.yml"]
  1. Settings -> Variables and secrets 添加 Secrets:
  • DOCKER_USER: Docker Hub 用户名
  • DOCKER_PASSWORD: Access Token (推荐)

4. 边缘部署 (Cloudflare Pages)

部署 _worker.js 进行流量路由,隐藏上游地址。

  1. 创建 Pages 项目,上传包含 _worker.js 的目录。
  2. 脚本内容 (修改 UPSTREAM_DOMAIN 为你的 HF 地址):
const UPSTREAM_DOMAIN = "your-space-name.hf.space"; export default { async fetch(request, env) { const url = new URL(request.url); // 仅放行 Docker V2 API if (!url.pathname.startsWith('/v2/')) { return new Response('Docker Registry Mirror is active.', { status: 200 }); } // 修改回源 Host url.hostname = UPSTREAM_DOMAIN; url.protocol = 'https:'; // 构建新请求 const newRequest = new Request(url, { method: request.method, headers: request.headers, body: request.body, redirect: 'follow' }); return fetch(newRequest); } };
  1. 关键: 在 Pages 设置中绑定自定义域名 (如 docker.yourdomain.com) 以绕过 DNS/SNI 污染。

5. 客户端配置

修改 /etc/docker/daemon.json

{ "registry-mirrors": [ "https://docker.yourdomain.com" ] }

重启 Docker:

systemctl daemon-reload && systemctl restart docker

6. 验证

执行 docker pull busybox

  • 如果成功: 说明链路通畅。
  • 关于 HF 休眠: 免费版 HF Space 闲置 48 小时后会休眠,首个请求会触发约 30 秒的冷启动,随后恢复极速。

Note: 此方案仅供个人技术研究。请勿滥用 Hugging Face 资源。

最新回复 (0)

    暂无评论

    • 碧蓝之星_深海迷航社区
      2
        点击登录 点击注册

请先登录后发表评论!

返回