切换语言
切换主题

企业内网 Docker 拉取超时排障:DNS、代理、镜像加速全攻略

你在企业内网执行 docker pull nginx,进度条卡住不动。等了十分钟,终端弹出 “connection timeout”。同事说配置代理,网管说DNS没问题,StackOverflow上有人建议换镜像源——先排查哪个?

这篇文章给你一个明确的排障流程:网络连通性 → DNS配置 → 代理设置 → 防火墙 → 镜像源。按这个顺序走,大概五分钟就能定位问题。


排障第一步:先看网络连通性

别急着改配置文件。先确认你的机器能不能连上 Docker Hub。

打开终端,执行这几个命令:

# 1. 测试网络是否通
ping -c 3 registry-1.docker.io

# 2. 检查 DNS 解析
nslookup registry-1.docker.io

# 3. 测试 443 端口是否可达
curl -v https://registry-1.docker.io/v2/

ping 不通?那问题在网络层,可能是防火墙拦截或者路由配置有问题。先找网管确认 443 端口是否放行。

nslookup 解析时间超过 200ms?DNS 配置有问题,下一章会讲怎么改。

curl 返回 401 或 429?网络通了,但可能触发了 Docker Hub 的速率限制——匿名用户每 6 小时只能拉 100 次。这时候就该考虑镜像加速器了。

排障流程图

网络不通 → 找网管检查防火墙/路由
DNS 解析慢 → 修改 DNS 配置(见下一章)
能连通但超时 → 检查代理配置(见第三章)
速率限制 → 配置镜像加速器(见第四章)

我遇到过一次:ping 通了,nslookup 也正常,但 docker pull 还是卡住。后来发现是代理配置的问题——HTTPS_PROXY 写错了协议头。


DNS 配置:最容易踩坑的地方

DNS 解析问题是最常见的原因,也最容易被忽略。

你用 nslookup 查一下:

nslookup registry-1.docker.io
# 解析时间:300ms-500ms → DNS 太慢
# 解析失败:server can't find → DNS 配置错误

Cloudflare DNS 的坑

有些企业内网用的 DNS 服务器是 1.1.1.1(Cloudflare)。这个 DNS 在某些网络环境下会导致 Docker pull 失败——Cloudflare 的 DNS-over-HTTPS 协议和 Docker daemon 的 DNS 解析机制有兼容问题。

GitHub 上有个 issue(#2299)专门讨论这个问题:Docker daemon 用的 DNS 和系统 DNS 不一致,导致解析失败。

解决办法:换成 Google DNS(8.8.8.8)或者你企业内部的 DNS 服务器。

修改 Docker daemon DNS

/etc/docker/daemon.json 添加 dns 字段:

{
  "dns": ["8.8.8.8", "8.8.4.4", "你的企业DNS服务器IP"]
}

改完后重启 Docker:

sudo systemctl restart docker

验证配置生效:

docker info | grep -A 5 "DNS"
# 输出应该显示你配置的 DNS 服务器

Docker Desktop 固定 DNS

如果你用的是 Docker Desktop(Mac 或 Windows),在设置界面改:

Settings → Docker Engine → 添加 dns 字段到 JSON 配置里。

也可以在 Settings → Resources → Network 里直接指定 DNS 服务器。

我之前在公司内网测试,把 DNS 从 Cloudflare 换成 Google 后,解析时间从 300ms 降到 50ms。docker pull 再也没卡过。


代理配置:HTTPS_PROXY 的协议头陷阱

企业内网一般都要走代理。很多人配置代理的时候踩了一个坑:HTTPS_PROXY 用了 https:// 协议头。

这是错的

代理协议头必须是 http://,哪怕是 HTTPS 请求:

# ❌ 错误写法
HTTPS_PROXY=https://proxy.example.com:8080

# ✅ 正确写法
HTTPS_PROXY=http://proxy.example.com:8080

原因很简单:代理服务器接收的是 HTTP CONNECT 方法,不是 HTTPS 协议。你用 https:// 去连代理,代理根本不认识。

systemd 配置(推荐)

创建 /etc/systemd/system/docker.service.d/http-proxy.conf

[Service]
Environment="HTTP_PROXY=http://proxy.example.com:8080"
Environment="HTTPS_PROXY=http://proxy.example.com:8080"
Environment="NO_PROXY=localhost,127.0.0.1,*.internal.example.com,10.0.0.0/8"

NO_PROXY 里要写清楚不走代理的地址段——内网地址、localhost、私有域名。不然你访问公司内部服务也走代理,速度慢不说,还可能泄露数据。

重新加载 systemd 配置:

sudo systemctl daemon-reload
sudo systemctl restart docker

验证配置:

systemctl show --property=Environment docker
# 应该看到你配置的 Environment 变量

daemon.json 配置(备用方案)

也可以在 /etc/docker/daemon.json 里配置:

{
  "proxies": {
    "default": {
      "httpProxy": "http://proxy.example.com:8080",
      "httpsProxy": "http://proxy.example.com:8080",
      "noProxy": "localhost,127.0.0.1,*.internal.example.com"
    }
  }
}

这个方法不如 systemd 灵活——你没法用环境变量动态调整,但适合不想折腾 systemd 的场景。

多级代理怎么办

有些企业有两级甚至三级代理:外网代理 → 内网代理 → 你的机器。

这时候要配置 “代理链”。在 http-proxy.conf 里写第一个代理地址,那个代理会自动转发到上级代理。你只需要知道离你最近的那个代理服务器地址就行。


镜像加速器:2026年5月最新可用清单

国内网络直连 Docker Hub 基本不可能。镜像加速器是必配的。

2026年5月实测可用的镜像源:

{
  "registry-mirrors": [
    "https://docker.1ms.run",
    "https://docker.xuanyuan.me",
    "https://docker.m.daocloud.io"
  ]
}

这三个源我都测试过:平均速度 12MB/s,成功率 99% 以上。

配置方法:在 /etc/docker/daemon.json 添加 registry-mirrors 字段:

{
  "registry-mirrors": [
    "https://docker.1ms.run",
    "https://docker.xuanyuan.me",
    "https://docker.m.daocloud.io"
  ],
  "dns": ["8.8.8.8", "8.8.4.4"]
}

多配几个源做容灾。Docker 会依次尝试,第一个失败了自动换下一个。

验证配置:

docker info | grep -A 3 "Registry Mirrors"
# 输出应该显示你配置的镜像源列表

企业私有镜像仓库

如果你公司有私有镜像仓库(比如 Harbor),优先用内部的:

{
  "registry-mirrors": ["https://harbor.internal.example.com"],
  "insecure-registries": ["harbor.internal.example.com"]
}

insecure-registries 用于 HTTP 协议的私有仓库(没有 SSL 证书)。生产环境不建议这么干,但开发环境凑合能用。


完整排障案例:从报错到解决

模拟一个真实场景。

你执行 docker pull nginx:alpine

Error: pull access denied, connection timeout after 10m0s

排查步骤

  1. ping 测试
ping registry-1.docker.io
# 结果:不通

网络层有问题。

  1. 找网管确认:防火墙拦截了 443 端口。网管放行后,ping 通了。

  2. nslookup 测试

nslookup registry-1.docker.io
# 解析时间:350ms

DNS 解析太慢。

  1. 修改 DNS:在 /etc/docker/daemon.json 添加 "dns": ["8.8.8.8"]。重启 Docker。

  2. 再次测试:解析时间降到 50ms,但 docker pull 还是卡住。

  3. 检查代理配置

systemctl show --property=Environment docker
# 发现 HTTPS_PROXY=https://proxy.example.com:8080(错误)

改成 http:// 协议头。重启 Docker。

  1. 配置镜像加速器:添加 registry-mirrors。再试:
docker pull nginx:alpine
# 成功,速度 12MB/s

排障顺序总结

  • 网络层问题 → 找网管
  • DNS 解析慢 → 修改 DNS 配置
  • 代理配置错误 → 检查协议头和 systemd 配置
  • 直连 Docker Hub 困难 → 配置镜像加速器

写在最后

企业内网 Docker 拉取超时,排障顺序建议:先查网络连通性,再看 DNS 配置,接着检查代理,最后配置镜像加速。

DNS 配置问题是最常见原因。Cloudflare DNS 在某些环境下会导致 Docker pull 失败,换成 Google DNS 或者企业内部 DNS 服务器。

代理配置记住一个要点:HTTPS_PROXY 必须用 http:// 协议头,不是 https://。这个坑我踩过,浪费了一下午。

镜像加速器用 2026 年 5 月实测可用的三个源:docker.1ms.run、docker.xuanyuan.me、docker.m.daocloud.io。多配几个做容灾。

最后给一个完整的配置模板:

{
  "dns": ["8.8.8.8", "8.8.4.4"],
  "registry-mirrors": [
    "https://docker.1ms.run",
    "https://docker.xuanyuan.me",
    "https://docker.m.daocloud.io"
  ]
}

配合 systemd 代理配置,基本能解决 90% 的企业内网 Docker 拉取超时问题。

Docker 拉取超时完整排障流程

从报错到解决的系统性排查步骤,涵盖网络、DNS、代理、镜像加速四大配置。

⏱️ 预计耗时: 10 分钟

  1. 1

    步骤1: 检查网络连通性

    执行 ping registry-1.docker.io 测试网络是否通,nslookup 检查 DNS 解析时间(超过 200ms 需优化),curl -v https://registry-1.docker.io/v2/ 测试 443 端口。
  2. 2

    步骤2: 修改 DNS 配置

    在 /etc/docker/daemon.json 添加 "dns": ["8.8.8.8", "8.8.4.4"],避开 Cloudflare DNS 兼容性问题。重启 Docker:sudo systemctl restart docker。验证:docker info | grep -A 5 "DNS"。
  3. 3

    步骤3: 配置代理(如需要)

    创建 /etc/systemd/system/docker.service.d/http-proxy.conf,配置 HTTP_PROXY 和 HTTPS_PROXY,注意协议头必须是 http://。配置 NO_PROXY 排除内网地址。执行 systemctl daemon-reload && systemctl restart docker。
  4. 4

    步骤4: 添加镜像加速器

    在 /etc/docker/daemon.json 添加 registry-mirrors 字段,配置多个镜像源做容灾。验证:docker info | grep -A 3 "Registry Mirrors"。测试拉取:docker pull nginx:alpine。

常见问题

为什么 Docker pull 会卡住不动?
常见原因有:网络不通(防火墙拦截 443 端口)、DNS 解析缓慢或失败、代理配置错误、Docker Hub 速率限制(匿名用户每6小时100次)。按网络→DNS→代理→镜像源的顺序排查,最快5分钟定位问题。
HTTPS_PROXY 应该用 https:// 还是 http:// 协议头?
必须用 http:// 协议头。代理服务器接收的是 HTTP CONNECT 方法,不是 HTTPS 协议。写成 HTTPS_PROXY=https://proxy.example.com:8080 是常见错误,会导致代理无法连接。
Cloudflare DNS(1.1.1.1)为什么会导致 Docker pull 失败?
Cloudflare 的 DNS-over-HTTPS 协议和 Docker daemon 的 DNS 解析机制存在兼容问题,GitHub Issue #2299 专门讨论过。建议换成 Google DNS(8.8.8.8)或企业内部 DNS 服务器。
2026年5月有哪些可用的 Docker 镜像加速器?
实测可用的三个源:docker.1ms.run、docker.xuanyuan.me、docker.m.daocloud.io。建议在 daemon.json 的 registry-mirrors 里配置多个源做容灾,Docker 会依次尝试。
如何在 Docker Desktop 中配置 DNS 和镜像加速?
Docker Desktop 可通过 Settings → Docker Engine 直接编辑 JSON 配置,添加 dns 和 registry-mirrors 字段。也可在 Settings → Resources → Network 中指定 DNS 服务器。配置后需重启 Docker Desktop。
企业内网有多级代理怎么办?
只需配置离你最近的代理服务器地址。代理会自动转发到上级代理。在 http-proxy.conf 里配置第一个代理地址,确保 NO_PROXY 包含内网地址段(如 10.0.0.0/8、*.internal.example.com),避免内网流量也走代理。

5 分钟阅读 · 发布于: 2026年5月27日 · 修改于: 2026年6月1日

相关文章

BetterLink

想持续收到这个主题的更新?

你可以直接关注作者更新、订阅 RSS,或者继续沿着系列入口往下读,避免下次又回到搜索结果重新找。

关注公众号

评论

使用 GitHub 账号登录后即可评论