当前位置: 首页 > article >正文

Docker 镜像拉不动?自建 Docker Hub 加速站 解决镜像拉取失败

本文首发于只抄博客,欢迎点击原文链接了解更多内容。

前言

众所周知,6 月份的时候,Docker Hub 的镜像就已经无法正常拉取,那会随手用 Nginx 反代了一下 Docker Hub,建了个自用的镜像站,一直用到了 9 月份,发现自建的镜像站也无法正常的拉取镜像了,看 Nginx 的日志全是 401 错误。

而拉取时候的报错则是连接不到 auth.docker.io,没想到是认证的域名也访问不到了,所以自己反代的镜像站也就无法拉取了。

docker-hub-1

于是在这里总结一下国内可以正常拉取镜像的方法,一种方法行不通了可以其他方法接着用

  • 通过 Nginx 反代 Docker Hub,现在还需要同时反代 auth.docker.io
  • 通过 Cloudflare Workers 反代
  • Docker 配置 Proxy

Nginx 反代

使用 1Panel 的还需要将 Nginx 自带配置中的 proxy_set_header Host $host; 注释掉

将下方 add_header www-authenticate 中的域名修改为自己的域名

location /v2/ {
  proxy_pass https://registry-1.docker.io; # Docker Hub 的官方镜像仓库
  proxy_set_header Host registry-1.docker.io;
  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;

  # 关闭缓存
  proxy_buffering off;

  # 转发认证相关的头部
  proxy_set_header Authorization $http_authorization;
  proxy_pass_header Authorization;

  # 重写 www-authenticate 头为你的反代地址
  proxy_hide_header www-authenticate;
  add_header www-authenticate 'Bearer realm="https://mirrors.domain.com/token",service="registry.docker.io"' always;
  # always 参数确保该头部在返回 401 错误时无论什么情况下都会被添加。

  # 对 upstream 状态码检查,实现 error_page 错误重定向
  proxy_intercept_errors on;
  # error_page 指令默认只检查了第一次后端返回的状态码,开启后可以跟随多次重定向。
  recursive_error_pages on;
  # 根据状态码执行对应操作,以下为301、302、307状态码都会触发
  error_page 301 302 307 = @handle_redirect;

}
# 处理 Docker OAuth2 Token 认证请求
location /token {
  resolver 1.1.1.1 valid=600s;
  proxy_pass https://auth.docker.io; # Docker 认证服务器

  # 设置请求头,确保转发正确
  proxy_set_header Host auth.docker.io;
  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;

  # 传递 Authorization 头信息,获取 Token
  proxy_set_header Authorization $http_authorization;
  proxy_pass_header Authorization;

  # 禁用缓存
  proxy_buffering off;
}
location @handle_redirect {
  resolver 1.1.1.1;
  set $saved_redirect_location '$upstream_http_location';
  proxy_pass $saved_redirect_location;
}

Workers 反代

如果你没有自己的 VPS,那么可以使用 Cloudflare 提供的 Workers 进行反代,但需要注意的,反代可能会违反 Cloudflare 的 ToS 导致账号违规

点击左侧的 Worker & Pages,然后点击 Create Worker 来新建一个 Worker

创建 Worker

名字可以随意命名,可以直接点击右下角的 Deploy 进行部署

命名 & 部署

然后编辑代码,将自带的内容全部删除后,复制 Github 的 _worker.js 中的代码并将 workers_url 修改为自己的绑定的域名

部署

由于自带的 workers.dev 域名无法正常访问,还需要在 Settings -> Domains & Routes 绑定自己的域名

绑定域名

使用方法

单次使用

直接在原拉取命令前添加镜像站地址

docker pull mirrors.domain.com/whyour/qinglong:latest

全局使用

通过在配置文件中填写 registry-mirrors 后,你可以直接使用原来的拉取命令来获取镜像

创建 /etc/docker/daemon.json 文件,填入以下内容

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

保存后,重启 Docker

systemctl daemon-reload
systemctl restart docker

配置 Proxy

如果你没有镜像站,也可以直接配置 Proxy,让 Docker 拉取镜像时走 Proxy 也能够正常使用

创建 /etc/systemd/system/docker.service.d 目录,并在该目录下新建 http-proxy.conf 文件填入以下内容

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"

保存后,重启 Docker

systemctl daemon-reload
systemctl restart docker

注意事项

自建的镜像站不要公开使用,Docker Hub 对于拉取频率有限制,对于匿名用户,限制设置为每个 IP 地址每 6 小时 100 次拉取。

通过以下请求获取 Token

TOKEN=$(curl "https://auth.docker.io/token?service=registry.docker.io&scope=repository:ratelimitpreview/test:pull" | jq -r .token)

再通过以下请求查看返回的 ratelimit-remaining 值就代表还剩下几次可以拉取

curl --head -H "Authorization: Bearer $TOKEN" https://registry-1.docker.io/v2/ratelimitpreview/test/manifests/latest

http://www.kler.cn/a/382767.html

相关文章:

  • Android Framework AMS(12)广播组件分析-3(广播发送流程解读)
  • 如何使用SSH密钥和公钥加密技术保护您的cPanel服务器
  • Python的条件语句if与match...case
  • web开发Django+vue3
  • Multimodal Reasoning with Multimodal Knowledge Graph
  • 计算机网络:简述LAN口模式下NAT和代理的区别
  • 非凸科技助力第49届ICPC亚洲区域赛(成都)成功举办
  • ELK-ELK基本概念_ElasticSearch的配置
  • 立冬:冬日序曲的温柔启幕
  • Renesas R7FA8D1BH (Cortex®-M85) 存储空间介绍
  • 无人机之飞行管控平台篇
  • Linux查看端口占用及Windows查看端口占用
  • 电话语音机器人,是由哪些功能构成?
  • 通过Django 与 PostgreSQL 进行WEB开发详细流程
  • HTMLCSS:爱上班的猫咪
  • InnoDB 存储引擎<五>undo log, redo log,以及双写缓冲区
  • 服务器开放了mongodb数据库的外网端口,但是用mongodbCompass还是无法连接。
  • go build --gcflags是什么意思, go build后面还可以接哪些选项
  • 荣耀2025秋招面试题:DiT与传统Stable Diffusion的区别
  • 【笔记】自动驾驶预测与决策规划_Part6_不确定性感知的决策过程
  • Spark 中 RDD 的诞生:原理、操作与分区规则
  • 详解Rust标准库:BTreeSet
  • containerd配置私有仓库registry
  • 【ESP32】ESP-IDF开发 | I2C从机接收i2c_slave_receive函数的BUG导致程序崩溃解决(idf-v5.3.1版本)
  • spring-boot(热部署)
  • 《深度学习》bert自然语言处理框架