本文记录了在腾讯云轻量服务器上遭遇 Docker 拉取镜像持续超时的完整排查过程。错误表现为 net/http: request canceled while waiting for connection,先后排查了 Docker 服务启动失败、daemon.json 配置语法错误、镜像加速器失效、DNS 解析异常以及系统级权限限制等问题。最终通过修正 JSON 配置文件、添加稳定的镜像加速器(如 docker.m.daocloud.io)并强制 Docker 使用公共 DNS(8.8.8.8)解决了网络连通性问题。本文总结了云服务器环境下 Docker 网络故障的系统性诊断方法,对类似场景有参考价值。

正文
一、问题现象
在腾讯云轻量服务器(Ubuntu)上执行 docker pull hello-world 时,返回如下错误:
Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
同时 systemctl status docker 显示服务启动失败,退出码为 1。
二、排查过程
1. Docker 服务无法启动
执行 sudo dockerd --debug 发现错误:
unable to configure the Docker daemon with file /etc/docker/daemon.json: invalid character ''' looking for beginning of object key string
原因:/etc/docker/daemon.json 中误用了单引号或格式错误。解决:使用正确 JSON 语法(双引号)重写配置文件。
2. 配置镜像加速器后仍超时
添加国内镜像源(中科大、网易、百度)后,docker info 显示已生效,但 docker pull 依然超时。进一步用 curl 测试加速器域名:
curl: (6) Could not resolve host: docker.mirrors.ustc.edu.cn
原因:DNS 解析失败。检查 /etc/resolv.conf 发现指向 127.0.0.53,虽然 nslookup baidu.com 正常,但部分镜像加速器域名无法解析。推测为 systemd-resolved 的上游 DNS 不稳定。

3. 强制 Docker 使用公共 DNS
修改 /etc/docker/daemon.json,加入 "dns": ["8.8.8.8", "114.114.114.114"],重启 Docker 后仍超时。此时尝试更换更可靠的加速器,如 DaoCloud 镜像源 https://docker.m.daocloud.io。
4. 奇怪的权限问题
在执行 sudo sed 修改 /etc/systemd/resolved.conf 时提示 Operation not permitted;执行 sudo mkdir -p /etc/systemd/system/docker.service.d 同样被拒绝。这可能是腾讯云轻量服务器的额外安全加固(如不可变标志或只读挂载),但鉴于 Docker 最终能正常工作,未深入追究。
三、最终解决方案
经过多次尝试,最终配置如下 /etc/docker/daemon.json:
sudo tee /etc/docker/daemon.json <<-‘EOF’
{
“registry-mirrors”: [
“https://docker.m.daocloud.io”,
“https://dockerproxy.com”,
“https://docker.mirrors.sjtug.sjtu.edu.cn”
],
“max-concurrent-downloads”: 10,
“max-concurrent-uploads”: 5,
“log-driver”: “json-file”,
“log-opts”: {
“max-size”: “10m”,
“max-file”: “3”
}
}
EOFsudo systemctl daemon-reload
sudo systemctl restart docker
执行 sudo systemctl daemon-reload && sudo systemctl restart docker 后,docker pull hello-world 成功拉取镜像,问题解决。
四、经验总结
-
JSON 格式必须严格:Docker 配置文件不支持注释、单引号或末尾逗号,建议用
jq或在线工具校验。 -
镜像加速器需测试连通性:并非所有国内加速器都永久可用,应优先选择 DaoCloud、阿里云(需账号)等稳定源。
-
DNS 问题常被忽略:即使宿主机能解析部分域名,Docker 守护进程可能使用不同的解析器,显式配置
dns是最可靠的方式。 -
云服务器安全组与系统加固:若遇到
Operation not permitted,需检查文件属性(lsattr)、SELinux 或云平台安全策略,必要时联系厂商。
总结
本次腾讯云轻量服务器 Docker 拉取镜像超时问题,根源在于网络连通性和 DNS 解析双重故障。初始阶段的配置格式错误导致服务无法启动,修正后虽配置了多个国内镜像加速器,但因上游 DNS 无法解析这些加速器域名,Docker 回退到直连 Docker Hub 而持续超时。通过为 Docker 守护进程显式指定公共 DNS 服务器(8.8.8.8),并更换为当前稳定的 DaoCloud 镜像源,最终恢复了正常的镜像拉取功能。此外,排查中遇到的 sed 和 mkdir 权限拒绝问题,提示腾讯云轻量服务器可能存在额外的文件系统保护机制,虽然未影响最终解决,但也提醒我们在云环境中需关注系统级安全策略对运维操作的限制。整体而言,Docker 网络故障的排查应遵循“服务状态 → 配置文件语法 → 镜像源可用性 → DNS 解析 → 底层网络连通性”的递进逻辑,而显式配置 dns 往往是解决域名解析相关超时的捷径。希望本文能为遇到类似问题的开发者提供清晰的排查思路和实用解决方案。



