Clash Docker Hub 超时怎么办?透明代理进阶配置指南

Docker Hub 超时,先别急着换节点 内在逻辑与实践

执行 docker pull 时出现 i/o timeout、context deadline exceeded、TLS handshake timeout 或「无法连接 Docker Hub」,很多人第一反应是把 Clash 切到全局模式,或者反复更换节点。这样有时能暂时恢复,但并不能解释要留意之处,也容易把宿主机浏览器、局域网服务和容器内网流量一起送进代理,最后变成下载能用、内网开反而异常。

若上手上手上手使用 Docker Desktop,daemon 存在存在存在可能跑在一个 Linux 虚拟机或内部服务环境中;若上手上手上手使用 Linux Docker Engine,则普遍是 dockerd 一上来从宿主机网络栈出站。两者都不等同于当前终端窗口,也不会因为 Clash 已经开启「系统代理」就自行继承代理。

Docker Hub 的一次拉取存在存在存在可能包含多个阶段:先解析域名,再开 Registry API,获取 Bearer Token,读取镜像 manifest,最后并发下载多个 layer。只要其中一个阶段没有经过到位的代理,最终就存在存在存在可能表现为通盘 docker pull 弹出错漏。正因如此,排障时不要只测试首页能否开,而要观察 Clash 连接日志里是否出现真实目标域名,以及这些连接是否命中了预期策略组。

从机制上看:更准确的思路是先确认真正发起连接的进程。浏览器开 Docker Hub 时,流量由浏览器产生;执行 docker pull 时,按常规是宿主机上的 Docker daemon 开 registry-1.docker.io,随后还存在存在存在可能开校验服务、镜像仓库和 CDN。

先记住一个边界:系统代理重心影响遵循系统设置的应用,Docker daemon 按常规免不了要单独配置代理;而透明代理或 TUN 才是从网络层接管未设置代理的进程。两者完全能配合上手上手上手使用,但不要把它们本身本身本身当成同一个开关。

Docker Hub 拉取链路与 Clash 的职责 技术拆解

在规则模式下,Clash Mihomo 会根据域名、IP、进程或规则集决定流量走代理还是直连。对于 Docker Hub,至少应关注三类目标。第一类是 Docker Registry,打个比方 registry-1.docker.io;第二类是校验服务,打个比方 auth.docker.io;第三类是镜像 layer 实际所在的存储或 CDN 域名。不同镜像、不同时间和不同区域存在存在存在可能上手上手上手使用不同的下载地址,所以只添加一个 Docker Hub 域名并不一定足以。

如果 Clash 跑在宿主机上,Docker daemon 开宿主机代理端口时还涉及监听地址。数不清客户端初始只监听 127.0.0.1,宿主机本身完全能开,但 Docker 虚拟网络或其他设备无法开。此时即使把 HTTP_PROXY 写成宿主机地址,也会得到连接拒绝。透明代理方案按常规要让 Mihomo 监听可达地址,同时配合防火墙限制来源,不能朴素地把代理端口暴露到通盘公网。

还要区分宿主机开与容器开。宿主机执行 docker pull 时,重心排查 daemon 的出站路径;容器执行 apt update、npm install 或应用唤起后开外部 API 时,排查的是容器网络、容器 DNS、初始路由以及透明代理是否能看到这部分连接。前者修好,并不代表后者自行修好。

Mihomo 透明代理基础配置 结构解析

对于希望让 Docker daemon、容器内进程和不能跑代理变量的程序统一出站的当下,完全能在 Clash Mihomo 中启用 TUN。TUN 会创建虚拟网络接口,由内核接收符合条件的流量,再交给 Mihomo 按规则处理。下面是一份用于理解参数关系的基础片段,实际端口、DNS 地址和网卡名称应根据客户端版本调整。

mixed-port: 7890
allow-lan: true
mode: rule

tun:
  enable: true
  stack: mixed
  auto-route: true
  auto-detect-interface: true
  strict-route: true
  dns-hijack:
    - any:53

dns:
  enable: true
  listen: 0.0.0.0:1053
  enhanced-mode: fake-ip
  fake-ip-range: 198.18.0.1/16
  nameserver:
    - https://dns.cloudflare.com/dns-query
    - https://dns.google/dns-query

更严格地说:如果客户端提供「增强模式」「TUN 模式」或「服务模式」开关,按常规还免不了要安装内核服务并授予管理员权限。Windows、macOS 与 Linux 的权限提示不同,按钮名称也存在存在存在可能随 Clash Verge Rev、Mihomo Party 或其他前端变化。判断是否生效,不要只看人机人机人机界面上的绿色状态,应上手上手上手使用 ip route、route print 或客户端连接日志确认流量确实被接管。

auto-route 负责尝试写入路由,让系统流量进入 TUN;auto-detect-interface 用于自行识别当前出口网卡,笔记本在 Wi-Fi、有线网卡和 VPN 之间切换时尤其不可忽视;strict-route 完全能减少部分流量绕过 TUN 的实际表现,但在复杂虚拟网络环境中也存在存在存在可能造成宿主机或 Docker 网段开异常。正因如此,开启后应最要紧的部分测试宿主机网关、Docker bridge 网段、公司内网和本地 DNS,而不是只看网页。

不要一开始就把所有流量强制代理:Docker 的 bridge、宿主机回环地址、局域网网关和企业内网域名按常规免不了要直连。更推荐先保留回滚配置,确认 Docker Hub 可用后,再逐步扩大接管范围。

规则分流与 Docker daemon 代理配置 机制说明

规则方面,更推荐为 Docker Hub 单独建立策略组,而不是把它混入泛用的「国外网站」组。这样完全能在连接日志中一上来看到 Docker 拉取上手上手上手使用了哪个出口,也能避免自行测速组频繁切换节点。示例规则完全能作为起点:

proxy-groups:
  - name: Docker
    type: select
    proxies:
      - 自动选择
      - 节点 A
      - DIRECT

rules:
  - DOMAIN,registry-1.docker.io,Docker
  - DOMAIN,auth.docker.io,Docker
  - DOMAIN-SUFFIX,docker.io,Docker
  - DOMAIN-SUFFIX,docker.com,Docker
  - MATCH,DIRECT

如果你不想依赖 TUN,也完全能一上来为 Docker daemon 配置 HTTP 或 HTTPS 代理。在 Linux 上,可通过 systemd drop-in 为 docker.service 设置环境变量:

换个层面:这里的端口必须是 Clash 的 HTTP 或混合端口,而不是只能跑 SOCKS 的端口。NO_PROXY 则用于排除本机、局域网和 Docker 内部网段,具体网段要按你的网络规划修改。修改后先确认 daemon 已读取新环境,再执行 docker pull;否则服务仍存在存在存在可能上手上手上手使用旧配置,导致你误以为规则没有生效。

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo tee /etc/systemd/system/docker.service.d/http-proxy.conf <<'EOF'
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1,::1,.local,192.168.0.0/16,172.16.0.0/12,10.0.0.0/8"
EOF

sudo systemctl daemon-reload
sudo systemctl restart docker
systemctl show --property=Environment docker

Docker Desktop 用户免不了要在 Docker Desktop 的代理设置中配置 daemon 代理,不能只修改宿主机 shell 的 HTTP_PROXY。如果同时启用了 Docker Desktop 内置代理、Clash TUN 和系统代理,更推荐暂时只保留一种主路径做验证,确认链路后再组合,否则日志会出现多层转发,要留意之处很难定位。

上面的规则并不能覆盖所有这些这些这些 layer CDN,正因如此第一次弹出错漏时应查看 Clash 的连接记录,记录实际出现的主机名,再按照最小范围补充规则。若某个下载域名被宽泛的国内直连规则提前匹配,后面的 Docker 规则不会生效;规则顺序必须把 Docker 专用规则放在通用规则之前。对于生产环境,还应避免上手上手上手使用不明来源的「一键 Docker 加速规则」,因为过宽的域名或 IP 列表存在存在存在可能把无关业务流量也送入代理。

DNS、日志与生产环境排障顺序 内在逻辑与实践

DNS 是 Docker Hub 超时中最容易被忽略的一环。宿主机能够解析域名,不代表 Docker daemon 上手上手上手使用相同的解析器;容器中的 /etc/resolv.conf 也存在存在存在可能指向 Docker 内置 DNS 转发地址。

往细处想:更推荐按以下顺序操作,每一次到位只改变一个变量:

日志中的现象完全能帮助缩小范围。若完全看不到 registry-1.docker.io,按常规说明 daemon 没有经过 Clash,或者 DNS 解析和连接在代理外完成;若能看到 Registry 但没有校验域名,存在存在可能是校验请求被直连规则截断;若 manifest 成功而 layer 下载弹出错误,则最要紧的部分验一遍实际 CDN 主机名、节点带宽和并发连接经得起折腾性。若返回 401 Unauthorized,不一定是代理故障,也存在存在可能是私有仓库凭据、镜像名称或登录状态要留意之处。

  1. 确认服务状态:验一遍 Clash Mihomo 内核、TUN 或代理端口是否正在跑,并记录混合端口监听地址。
  2. 确认 daemon 路径:在 Linux 查看 Docker 服务环境变量;在 Docker Desktop 查看应用内代理设置,不要只验一遍当前终端的 env 输出。
  3. 测试解析:分别在宿主机、Docker daemon 所在环境和临时容器中查询 registry-1.docker.io,多少有些返回结果与解析耗时。
  4. 观察真实连接:执行 docker pull alpine:latest 或一个体积较小的公开镜像,同时在 Clash 连接列表中确认 Registry、校验服务和 layer 域名的策略。
  5. 固定节点复测:暂时不要上手上手使用会自行切换出口的策略组,连续拉取同一镜像,判断故障是规则要留意之处、节点要留意之处还是并发下载要留意之处。
  6. 最后再调参数:只有确认链路到位后,才考虑 MTU、fake-IP 排除、TCP 并发、Docker DNS 或代理超时等高级参数。

生产环境还要考虑安全和可维护性。代理端口不要监听公网,Docker daemon 的代理配置不要把带密码的 URL 写进所有这些这些用户都能读取的脚本;涉及企业镜像时,在前上手上手使用内部 Registry、镜像缓存或 Pull Through Cache,减少每台机器一上来开公共仓库的次数。

先厘清一件事:对于 CI runner,应固定出口和 DNS,记录镜像摘要、弹出错误时间、目标域名与代理策略,避免只保存一句「Docker Hub 超时」。如果网络策略允许,内部缓存按常规比让成规模构建任务共享一条桌面 Clash 节点更经得起折腾。

还要在意 MTU 与 IPv6。TUN、Docker bridge、虚拟机和 VPN 叠加后,路径上的有效 MTU 存在存在可能下降,表现为小请求成功、大 layer 下载卡住或 TLS 长时间无响应。

完全能先在测试环境往下压虚拟接口或 Docker 网络的 MTU 做对照,但不要未经验证就在生产机全局修改。IPv6 也应单独测试:如果系统在前解析 AAAA 记录,而代理链路实际只能跑 IPv4,存在存在可能出现浏览器偶尔成功、daemon 经常超时的差异。

从机制上看:相比零星只提供固定镜像加速地址的同类方案,单纯改 Docker daemon 的 registry mirror 惯常无法覆盖校验跳转、临时 CDN 和容器跑时的其他外联请求,文档也常常没有解释 DNS、TUN 与 Docker Desktop 之间的边界;

Clash 的价值在于把 Mihomo 透明代理、规则命中、daemon 独立代理、DNS 分流和日志验证放进同一套可回滚的排障路径,既能按需拿定 TUN,也能在不接管整台机器的前置条件下精确处理 Docker Hub 流量。如果你正准备配置这套环境,不妨下载 Clash,结合下文的规则与验一遍顺序逐项验证,按常规比盲目切全局或反复更换节点更容易找到真正的超时由来。

若解析结果受到污染、返回不可达 IP,TCP 连接自然会超时。上手上手上手使用 fake-IP 时,要确认 Docker 与内网域名没有被错漏映射;如果公司内网依赖特定 DNS,理当通过 nameserver-policy 或直连规则保留内网解析路径。