马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
docker: Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection,或者 dial tcp ip: connect: connection refused——这两条报错几乎人人都撞过。改镜像源、改 DNS、手动带源 pull,网上方案一大堆,很多人换了十几处还是不行。这篇先讲清这两条报错分别指向什么,再给出一套按层排查的顺序,最后落到最常漏的那一层:Docker daemon 的代理配置。
一、先看报错到底在说哪一层
| 报错形态 | 关键词 | 指向 |
| request canceled while waiting for connection | 超时 | 连上了在等响应,网络慢或被限速 |
| dial tcp: connect: connection refused | 拒绝连接 | 目标地址不可达/端口不通 |
| Timeoutexceeded while awaiting headers | 等头超时 | 请求发出去了但响应头迟迟不来,多为代理或 DNS 问题 |
区分原则很简单:看到 timed out / canceled,先怀疑链路与代理;看到 refused,先怀疑 DNS 与目标可达性。 很多人不分青红皂白全去换镜像源,方向就错了。
二、第一层:镜像加速器
改 /etc/docker/daemon.json:
sudo vi /etc/docker/daemon.json
{
"registry-mirrors": [
"https://<你的加速器地址>.mirror.aliyuncs.com",
"https://docker.mirrors.ustc.edu.cn"
]
}
然后:
sudo systemctl daemon-reload
sudo systemctl restart docker
注意两点:一是 JSON 格式必须合法,多一个逗号 daemon 就起不来;二是公共镜像加速器会随时间失效或改名,加完如果还报错,先看报错里的域名是不是自己写的那个,别以为加了就万事大吉。
三、第二层:DNS 配置
DNS 有问题也会导致拉取镜像报错。先看:
cat /etc/resolv.conf
如果 nameserver 后面没有 IP,或 IP 明显不对(比如内网网关地址配错),就改掉。编辑:
sudo nano /etc/resolv.conf
nameserver 114.114.114.114
nameserver 8.8.8.8
公共 DNS 可用,但生产环境更推荐指向内网 DNS,可控且可审计。
四、第三层:手动带源拉取(验证用)
docker pull registry.example.cn/library/mysql:8.0
或直接用镜像站的完整地址拉公共镜像。这一步的价值不在"一定能成功",而在于它是一次不带 daemon 配置的对照实验:如果带源地址能拉下来、不带源不行,问题就定位在 daemon 的网络配置上,而不是本机网络。
五、第四层:Docker daemon 代理(最常漏)
下面这三条按官方写法来,适用于任何需要经正向代理出网的环境(企业内网、机房、只有代理能上外网的机器)。
1. 建目录
sudo mkdir -p /etc/systemd/system/docker.service.d
2. 建配置文件
sudo touch /etc/systemd/system/docker.service.d/http-proxy.conf
3. 写入代理环境变量
sudo vim /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,.example.com"
说明:HTTP_PROXY 用于代理 http 请求,HTTPS_PROXY 用于代理 https 请求;想让某些 IP 或域名不走代理,写进 NO_PROXY。私服 registry、内网镜像仓库一定要放 NO_PROXY,否则内网请求会被送去外网代理。
4. 刷新并重启
sudo systemctl daemon-reload
sudo systemctl restart docker
5. 验证
docker pull hello-world
能拉到就说明整条链路通了。
六、排查顺序小结
- 读报错区分超时还是拒绝连接;
- 换/修镜像加速器,重启 daemon 验证;
- 查 resolv.conf,确认 DNS 可用;
- 带源手动 pull 做对照;
- 配 daemon 的 HTTP_PROXY / HTTPS_PROXY / NO_PROXY,重启后再试。
按这个顺序走,比在网上挨个试"换源八连"高效得多。另外提醒一句:配代理时把 NO_PROXY 写全,内网镜像私服和 127.0.0.1 一定要留在里面,不然会出现"代理一开,内网全断"的反向事故。
qidao123.com企服评测-应用市场 编辑提示
本文按两类报错的关键词区分(超时 canceled 与拒绝连接 refused 分别指向链路与 DNS)、daemon.json 的 registry-mirrors 配置与 JSON 合法性要点与 daemon-reload 重启、resolv.conf 的 nameserver 检查与公共/内网 DNS 取舍、带源 docker pull 的对照实验思路、以及 /etc/systemd/system/docker.service.d/http-proxy.conf 的 HTTP_PROXY 与 HTTPS_PROXY 与 NO_PROXY 三步配置与验证方法,重排成一层一层收窄的排查框架。文中域名与端口均为示意值,配置键名取自 Docker 官方文档与 systemd 说明;代理与镜像源请替换为自身环境可用的合法配置,操作限于自有或已授权主机,内网私服务必留在 NO_PROXY 中。 |