Docker 拉镜像报 proxyconnect tcp: EOF 的正确解法

宝塔面板上一键部署一个项目,卡在拉镜像那步:

Image mysql:8.2 Error Get "https://registry-1.docker.io/v2/": proxyconnect tcp: EOF
Error response from daemon: Get "https://registry-1.docker.io/v2/": proxyconnect tcp: EOF

关键词是 proxyconnect tcp: EOF——Docker 通过代理连 Docker Hub 时握手就断了。不是网络挂了,是代理配置有问题。

第一步:看 Docker 是不是走代理

docker info | grep -i proxy

如果看到类似:

HTTP Proxy: http://127.0.0.1:7890
HTTPS Proxy: http://127.0.0.1:7890

说明 Docker daemon 被配了代理。接着验证代理是不是能用:

curl -x http://127.0.0.1:7890 https://registry-1.docker.io/v2/
  • 返回 {} 或认证提示:代理正常
  • EOF / timeout:代理进程挂了
  • Connection refused:代理端口没开

三个典型场景

  1. 系统开了 Clash/v2ray,但 Docker daemon 拿不到——Docker 不会自动继承桌面代理,Mac 上尤其容易踩。
  2. 代理协议写错——把 http://127.0.0.1:7890 写成了 https://,直接握手失败。
  3. 代理软件本身抽风或被墙——重启一下代理再试。

解决办法

方案一:临时不走代理

先确认到底是不是代理的锅:

unset http_proxy https_proxy HTTP_PROXY HTTPS_PROXY
docker pull redis:latest

拉得下来就是代理问题,不用再折腾 Docker 本身了。

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

编辑 daemon 配置:

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

写入:

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

重启:

sudo systemctl daemon-reexec
sudo systemctl restart docker

再拉镜像基本就通了。注意公开镜像源可用性经常变化,实在拉不下来就换一个。

方案三:正确给 Docker 配代理

如果确实需要走代理,别改环境变量,改 systemd 单元:

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"

然后:

sudo systemctl daemon-reload
sudo systemctl restart docker

一句话总结

proxyconnect tcp: EOF = Docker 正在走一个 坏掉的代理。先 unset 代理确认锅在哪儿,然后要么配国内镜像源,要么正确写 systemd 代理配置。