国内 Docker 拉取失败?手把手教你用 Cloudflare 搭建私有镜像加速器

一、为什么你的镜像加速器失效了?

由于近期网络环境变化,传统的 Docker 镜像站大面积失效。即便使用了代理,很多国内服务器在拉取镜像时仍会报错: failed to fetch anonymous token: dial tcp 31.13.69.245:443: connect: connection refused 这是因为 Docker 的认证服务器 (auth.docker.io) 无法连接。我们需要一个能同时代理“镜像数据”和“认证令牌”的方案。


二、部署Cloudflare Workers 代理

Cloudflare Workers 提供的边缘计算能力,可以让我们在请求流经时,动态修改认证头信息,让 Docker 客户端误以为“认证服务器就是你的代理站”,从而实现全程闭环访问。

1. 创建 Worker

  1. 登录 Cloudflare 控制台
  2. 进入 Workers 和 Pages -> 创建应用程序
  3. 点击 从 Hello World! ,输入 Worker name(自定义子域名),点击 部署

  4. 部署后,等部署刷新界面后,进入 编辑代码 界面。

2. 部署脚本

清空默认代码,粘贴以下经过实测优化的代码:

// Cloudflare Worker 代码开始
const hub_host = 'registry-1.docker.io'
const auth_url = 'https://auth.docker.io'

async function handleRequest(request) {
  const url = new URL(request.url);
  const path = url.pathname;

  // 1. 处理 Token 认证请求:拦截并转发至官方认证服务器
  if (path === '/v2/token' || path === '/token') {
    const newUrl = new URL(auth_url + path + url.search);
    return fetch(new Request(newUrl, request));
  }

  // 2. 转发镜像层数据请求
  const newUrl = new URL('https://' + hub_host + path + url.search);
  let response = await fetch(new Request(newUrl, request));
  
  // 3. 核心步骤:修改认证挑战响应头
  // 告知客户端不再去访问 auth.docker.io,而是回到当前域名下获取 Token
  let newResponse = new Response(response.body, response);
  if (response.headers.has('Www-Authenticate')) {
    let authHeader = response.headers.get('Www-Authenticate');
    let re = new RegExp(auth_url, 'g');
    newResponse.headers.set('Www-Authenticate', authHeader.replace(re, 'https://' + url.hostname));
  }
  
  return newResponse;
}

addEventListener('fetch', event => {
  event.respondWith(handleRequest(event.request))
})
图片[1] - 国内 Docker 拉取失败?手把手教你用 Cloudflare 搭建私有镜像加速器 - HXL Blog

三、 关键:绑定自定义域名

注意: 默认的 *.workers.dev 域名在国内访问极不稳定,直接绑定自己的域名可靠一些。

图片[2] - 国内 Docker 拉取失败?手把手教你用 Cloudflare 搭建私有镜像加速器 - HXL Blog
  1. 在 Worker 的 设置 -> 域和路由 中点击 添加
  2. 绑定一个你自己的二级域名(例如:docker.yourdomain.com)。

四、 如何在服务器上使用?

方式 1:临时测试使用

直接在拉取镜像时加上前缀:

docker pull docker.yourdomain.com/library/alpine:latest

方式 2:永久配置 (以 1Panel 为例)

  1. 登录 1Panel 面板,进入 容器 -> 配置
  2. 镜像加速 栏目点击编辑。
  3. 添加你的自定义域名地址:https://docker.yourdomain.com
  4. 保存后,Docker 将自动通过你的 Worker 加速。

五、 常见问题与限制 (FAQ)

  • 流量够用吗? 免费版每天 10 万次请求,个人使用几乎相当于无限。
  • 会被封吗? 只要不公开做大型公共站,低频自用非常安全。
  • 拉取依然 404? 检查代码中是否包含了 /v2/token/token 的双重匹配,这是兼容不同版本 Docker 客户端的关键。
© 版权声明
THE END
喜欢就支持一下吧
点赞8 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容