W
Web指南 webzhinan.co
全球热门网站 GitHub Linux / Windows / macOS 开发与镜像

Docker Pull 报错 Connection Refused / 镜像拉取超时全解:国内镜像源与专线代理配置

作者:Web指南技术组 · 更新时间: · 已核验 (2026-08)

快速解决答案 (Quick Answer)

已核验 (2026-08)

Docker pull 镜像超时或 Connection Refused 是因为国内本地运营商对 Docker Hub 官方域名(registry-1.docker.io)实施了 DNS 污染与 TCP 连接重置。且由于 dockerd 守护进程由 Systemd 独立管理,在终端 export http_proxy 对其无效。根本解决方案:1. 为 Systemd 守护进程创建 http-proxy.conf 注入代理;2. 或在 Docker Desktop 图形界面开启 Manual proxy;3. 配置企业级私有镜像加速源。

交互式排障 SOP 进度跟踪器

点击勾选已完成的排查步骤,系统将实时计算排障完成度:

0/4 (0%)

快速结论与 Docker 镜像拉取故障机理

在 Linux 服务器、Windows WSL2 或 Mac 终端上执行 Docker 镜像拉取(如 docker pull nginx:latestdocker compose up -d)时,控制台频繁抛出以下致命异常:

Error response from daemon: Get "https://registry-1.docker.io/v2/": dial tcp 199.59.148.82:443: connect: connection refused
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: TLS handshake timeout
error pulling image configuration: download failed after 6 attempts: EOF

其本质原因是 Docker 官方核心注册表(registry-1.docker.io 与 auth.docker.io)位于海外 AWS 机房,在国内常规运营商网络下遭遇了严重的路由级 TCP 连接重置与 DNS 污染


架构解析:为什么终端 Shell 代理对 Docker 守护进程完全无效?

许多开发者在遇到问题时,首先会在终端运行 export http_proxy=http://127.0.0.1:7890,但发现 docker pull 依然超时。必须从 Docker 的分层架构理解这一现象:

[开发者终端 (CLI Shell)]  ──► 执行 docker pull alpine (读取终端环境变量)

          │ (通过本地 UNIX Socket: /var/run/docker.sock 传递指令)

[Docker Daemon 守护进程 (dockerd)] ──► 真正发起网络请求拉取镜像 (受 Systemd 托管)

          ├─► 默认情况下:无法继承终端 Shell 的 HTTP_PROXY 环境变量!
          └─► 必须直接为 Systemd 服务注入 Environment 变量才能生效!

方案一:为 Linux Systemd Docker Daemon 配置持久化代理(生产与服务器首选)

这是最标准、最稳定且不依赖任何第三方镜像源的官方解决方案:

1. 创建 Systemd 服务覆盖配置目录

以 root 或 sudo 权限在终端执行:

sudo mkdir -p /etc/systemd/system/docker.service.d

2. 创建并编辑 http-proxy.conf 配置文件

sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf

在文件中写入以下标准配置(请将 127.0.0.1:7890 替换为您本地代理客户端的实际监听地址与端口;若是远程局域网代理,请填入对应的局域网 IP):

[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,docker-registry.local,*.aliyuncs.com,*.mycompany.com"

3. 重载 Systemd 守护进程并重启 Docker 服务

依次执行以下命令使配置立即生效:

sudo systemctl daemon-reload
sudo systemctl restart docker

4. 验证代理注入是否成功

运行以下验证指令:

docker info | grep -i proxy

如果控制台正确输出了 HTTP Proxy: http://127.0.0.1:7890HTTPS Proxy: http://127.0.0.1:7890,说明配置已完全生效。此时执行 docker pull mysql:8.0 即可享受秒级拉取体验。


方案二:Windows 11 / macOS Docker Desktop 图形化一键配置

如果你是在个人电脑上使用官方 Docker Desktop:

  1. 打开 Docker Desktop 客户端主界面;
  2. 点击右上角 齿轮图标 (Settings) 进入设置中心;
  3. 在左侧功能导航栏中点击 Resources → 选择 Proxies
  4. Manual proxy configuration 开关切换为 开启状态
  5. Web Server (HTTP) 输入框中填入:http://127.0.0.1:7890
  6. Secure Web Server (HTTPS) 输入框中填入:http://127.0.0.1:7890
  7. Bypass for these hosts & domains 中填入:localhost,127.0.0.1
  8. 点击右下角 Apply & restart,等待 Docker 引擎重启完成(左下角变绿)。

方案三:配置本地 / 私有镜像加速源 (daemon.json)

如果你拥有阿里云或企业内部的专属 Harbor 镜像源加速地址:

  1. 编辑 Docker 核心守护进程配置文件:
    sudo nano /etc/docker/daemon.json
  2. 写入 registry-mirrors 数组配置:
    {
      "registry-mirrors": [
        "https://your-custom-id.mirror.aliyuncs.com",
        "https://dockerproxy.net"
      ]
    }
  3. 保存退出后重启 Docker:
    sudo systemctl restart docker

排错与调试命令大全

在排查拉取异常时,推荐运行以下指令快速定位链路故障:

# 1. 查看 Docker 守护进程的实时运行日志
journalctl -u docker.service -n 50 --no-pager

# 2. 手动测试与 Docker 官方认证服务器的连通性
curl -i -x http://127.0.0.1:7890 https://auth.docker.io/token?service=registry.docker.io

# 3. 手动测试与镜像存储 CDN 的握手延迟
curl -i -x http://127.0.0.1:7890 https://registry-1.docker.io/v2/

不同镜像拉取方案全维度对比表

方案模式镜像完整度同步时效性维护成本推荐适用场景
Systemd 专线代理直连官方100% (官方全部镜像)实时 (0 延迟同步)低 (一次配置永久生效)所有开发机、CI/CD 编译机 (强烈推荐)
私有企业级 Harbor 仓库仅限企业推送的镜像需手动同步高 (需维护服务器)大型企业团队协同研发
国内公有云专属加速源较高5~30 分钟延迟中 (需实名绑定云主机)部署在云上的生产服务器
第三方免费公开加速站参差不齐 (部分残缺)经常失效或断连极高 (频繁失效更换)临时应急排障

常见问题解答 (FAQ)

Q 为什么在终端执行 export http_proxy 后,docker pull 依然拉取超时?

这是最经典的 Docker 配置盲区。docker pull 命令只是一个客户端 CLI 工具,它在收到指令后,会通过本地 UNIX Socket (/var/run/docker.sock) 将拉取任务转交给后台常驻的 Docker Daemon 守护进程(dockerd)。dockerd 由操作系统的 Systemd 服务独立管理,并不会继承用户终端 Shell 中的环境变量。

Q 使用公共免费的 Docker 镜像源安全吗?

存在一定的供应链安全隐患。部分小型第三方公共加速源可能因缓存污染或未及时同步官方安全补丁导致拉取到过时镜像,甚至存在恶意中间人篡改二进制镜像层的风险。对于生产环境与重要研发流水线,推荐使用经过专线代理直连 Docker Hub 官方,或搭建基于 Harbor / 阿里云容器镜像服务的私有加速源。

Q 配置代理后如何排查代理是否真正对 Docker 生效?

在 Linux 终端执行 docker info 命令,向下滚动查找“HTTP Proxy”、“HTTPS Proxy”和“No Proxy”三行信息。如果正确显示了你配置的代理 IP 与端口,说明守护进程已成功加载代理;随后执行 docker pull alpine:latest 即可测试连通性。

Q 在 Dockerfile 中执行 RUN apt-get / curl 时也会走 Docker Daemon 代理吗?

不会!Docker Daemon 的代理仅用于 docker pull 和 docker push 镜像本身。在 docker build 构建镜像阶段,RUN 指令运行在独立的隔离容器中。若需在容器构建阶段走代理,必须在 ~/.docker/config.json 中配置客户端代理,或在 build 命令中传入 --build-arg HTTP_PROXY 参数。

Q 提示“Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: TLS handshake timeout”是什么意思?

该错误表明本地主机与 Docker Hub 的 TLS 握手阶段超过了超时阈值(通常为 15 秒)。这是典型的跨境物理网络高丢包或本地运营商对 443 端口发起 TCP RST 复位阻断导致的现象。

Q 国内大厂云服务商(如阿里云、腾讯云)的 Docker 镜像加速器还能用吗?

自 2024 年下半年起,国内绝大部分公有云厂商已关闭了面向未实名公众用户的公开镜像加速源,转为仅对绑定了云上服务器 ECS/CVM 实例的私有账号开放。普通本地开发机推荐采用 Systemd 专线代理直连官方方案。

Q 如何在 WSL2 (Ubuntu on Windows) 中让 Docker 走宿主机代理?

在 WSL2 中,宿主机 Windows 的 IP 通常为 resolv.conf 中的 nameserver 地址。可在 /etc/systemd/system/docker.service.d/http-proxy.conf 中将代理地址指定为宿主机的局域网 IP:7890,并在 Windows 代理客户端中开启“Allow LAN(允许局域网连接)”。

Q 遇到“toomanyrequests: You have reached your pull rate limit”怎么办?

这表明当前出口 IP 触发了 Docker Hub 针对未登录匿名用户的拉取频率限制(每 6 小时 100 次)。解决方法:在终端执行 docker login 登录免费的 Docker Hub 注册账号,即可将拉取配额提升至每 6 小时 200 次,或切换为独立的专线出口 IP。

Web指南质量与事实核验标准:

本指南由 Web指南技术团队基于真实环境测试与官方技术文档编写。所有步骤经过 Windows 11/10、Chrome 最新稳定版及主流网络环境复现验证。如遇版本更新或界面变动,欢迎通过 反馈通道 提交指正。