在使用 Docker 的过程中,很多人都会遇到一个令人头疼的问题——无法拉取镜像,报错 i/o timeout。本文将以我的一次真实排查经历为例,详细记录从问题出现到最终解决的全过程。

一、问题背景

我在一台云服务器(Ubuntu 系统)上安装了 Docker,并尝试执行:docker search nginx

结果报错如下:

Error response from daemon: Get "https://index.docker.io/v1/search?q=nginx&n=25": dial tcp 45.114.11.238:443: i/o timeout

这意味着 Docker 无法访问 Docker Hub(index.docker.io),也就是网络层面出了问题。

二、初步分析:可能的原因

出现 i/o timeout 的常见原因包括:

1、外部网络访问受限

1)服务器所在网络(如云主机)无法访问外网。

2)云服务商安全组或防火墙阻止了 443 端口出站。

2、Docker Daemon 代理配置错误

Docker Daemon 使用了错误的代理,导致请求被阻断。

3、DNS 解析问题

/etc/resolv.conf 配置异常,导致域名无法解析。

4、官方镜像源访问慢

Docker Hub 在国内访问速度极慢或被墙。

三、排查步骤

1️⃣ 查看 Docker 网络配置

执行:docker network inspect bridge

输出结果中 Subnet 为 172.17.0.0/16,Gateway 为 172.17.0.1,配置正常,说明 Docker 内部网络没有问题。

2️⃣ 检查 Docker 环境变量(代理配置)

执行:systemctl show --property=Environment docker

结果为空:Environment=

说明当前 Docker 没有启用任何代理。排除代理配置错误的可能。

3️⃣ 尝试访问国内镜像仓库

我尝试拉取阿里云镜像 docker pull registry.cn-hangzhou.aliyuncs.com/lts/ubuntu:latest

报错:pull access denied for registry.cn-hangzhou.aliyuncs.com/lts/ubuntu

这是因为镜像路径不存在或私有仓库未登录。

四、解决思路:使用国内镜像加速器

Docker 默认使用国外的官方镜像源,国内访问通常会出现超时。因此我们可以手动配置国内镜像加速器。执行以下命令

将下面的"阿里云镜像加速器"换成你的专属加速器地址(格式类似 https://xxxx.mirror.aliyuncs.com)

sudo tee /etc/docker/daemon.json <<EOF
{

"registry-mirrors": [

"阿里云镜像加速器",

"https://docker.1panel.live",

"https://hub-mirror.c.163.com"

]

}

EOF

然后重启 Docker 服务:

sudo systemctl daemon-reload

sudo systemctl restart docker

图示:阿里云镜像加速器位置

五、结果验证

再次尝试拉取镜像:

docker pull registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9

成功输出:

3.9: Pulling from google_containers/pause

61fec91190a0: Pull complete

Digest: sha256:7031c1b283388d2c2e09b57badb803c05ebed362dc88d84b480cc47f72a21097

Status: Downloaded newer image for registry.cn-hangzhou.aliyuncs.com/google_containers/pause:3.9

这说明 Docker 已经能够正常连接镜像源并拉取镜像。

不过,当尝试网易镜像:docker pull hub.c.163.com/library/nginx:latest

仍然报错:

net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)

这表明网易的镜像源服务可能已经停止或不稳定。

总结:

1、“Docker 拉不下镜像,十有八九是网络问题,最稳的解决方法就是国内镜像加速 + 正确的安全组配置。”

2、阿里云镜像仓库(镜像加速器)

我们在在 /etc/docker/daemon.json 中配置"registry-mirrors"我们的阿里云镜像加速器,

并重启 Docker 后,Docker Daemon 在拉取镜像时会这样做:

先访问阿里云加速器服务器

阿里云加速器会帮我们中转访问 Docker Hub(官方仓库)

并将常见镜像缓存到国内节点

所以我们实际上还是在拉取 Docker Hub 的镜像资源,只不过是通过阿里云中转、加速访问。

3、阿里云镜像仓库和 Docker Hub 的关系

项目Docker Hub阿里云镜像加速器
所在地区国外(美国)国内(阿里云机房)
访问速度慢(常超时)快(国内网络)
镜像来源官方源官方源的缓存加速
是否完全一致✅ 是,内容相同(同步拉取)
是否需要改命令❌ 不需要,命令一样

更多推荐