Docker 镜像拉取失败:proxyconnect tcp EOF 与国内镜像源配置

proxyconnect tcp: EOF 这个错误不是 Docker Hub 故障,而是 Docker daemon 正在使用一个不可达的代理

快速诊断

# 查看 Docker 是否配置了代理
docker info | grep -i proxy

# 查看环境变量
env | grep -i proxy

如果看到:

HTTP Proxy: http://127.0.0.1:7890

说明 Docker 正在走代理,需要验证代理是否可用:

curl -x http://127.0.0.1:7890 https://registry-1.docker.io/v2/
  • 返回 {} 或认证信息 → 代理正常
  • EOF / timeout → 代理链路断了
  • Connection refused → 代理未启动

方案一:清除代理环境变量(临时)

unset http_proxy
unset https_proxy
unset HTTP_PROXY
unset HTTPS_PROXY

docker pull redis:latest

如果此时能拉成功,说明就是代理问题。

方案二:配置国内镜像源(推荐)

sudo mkdir -p /etc/docker
sudo nano /etc/docker/daemon.json

写入:

{
  "registry-mirrors": [
    "https://mirror.ccs.tencentyun.com",
    "https://registry.docker-cn.com"
  ]
}

然后重启:

sudo systemctl daemon-reexec
sudo systemctl restart docker

验证:

docker info | grep -A5 "Registry Mirrors"

方案三:正确配置 Docker daemon 使用代理

Docker 不会自动读取系统代理(即使浏览器能上网),需要单独配置:

sudo mkdir -p /etc/systemd/system/docker.service.d
sudo nano /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"
Environment="NO_PROXY=localhost,127.0.0.1"

注意:代理地址必须用 http://,不能写 https://

HTTPS_PROXY=https://127.0.0.1:7890  ← 错误
HTTPS_PROXY=http://127.0.0.1:7890   ← 正确

重新加载:

sudo systemctl daemon-reload
sudo systemctl restart docker

常见坑

Docker 不继承系统代理:Clash/sing-box 开了,Docker 仍然无法自动使用,必须显式配置 /etc/systemd/system/docker.service.d/http-proxy.conf

proxyconnect tcp: EOFconnection refused 的区别:

  • EOF → 代理在监听但链路断了(软件崩溃、配置错误)
  • refused → 代理根本没有在对应端口监听