基于 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 (源)
核心优势:
- 洗白 IP: 请求由 Hugging Face 的服务器(通常是 AWS 基础设施)向 Docker Hub 发起,避开了 Cloudflare 的“高风险”IP 段。
- 服务端强制认证: 在 HF 端通过环境变量注入 Docker Hub 账号,将所有下游的匿名请求转换为上游的已认证请求,享受更高的速率限制(免费账号 200次/6小时,Pro 账号无限)。
- 抗干扰: 前端 Cloudflare 绑定自定义域名,解决本地 SNI 阻断问题。
3. 后端部署 (Hugging Face)
利用 HF Space 运行官方 Registry 容器,作为带认证的上游代理。
- 创建 Space (SDK 选择 Docker, Visibility 选择 Public)。
- 新建
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"]
- 在 Settings -> Variables and secrets 添加 Secrets:
DOCKER_USER: Docker Hub 用户名DOCKER_PASSWORD: Access Token (推荐)
4. 边缘部署 (Cloudflare Pages)
部署 _worker.js 进行流量路由,隐藏上游地址。
- 创建 Pages 项目,上传包含
_worker.js的目录。 - 脚本内容 (修改
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);
}
};
- 关键: 在 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 资源。
暂无评论