问题描述

云服务器安装完 Docker 之后,想安装 mysql,但是通过命令 docker search mysql 查看相应版本信息时报错超时,具体信息如下:

Error response from daemon: Get “https://index.docker.io/v1/search?q=mysql&n=25”: dial tcp 65.49.26.99:443: i/o timeout

问题分析

1、修改配置文件
将之前 /etc/docker/daemon.json 文件中配置的镜像源修改为腾讯云镜像源。

vim /etc/docker/daemon.json

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

2、重启 Docker 服务

sudo systemctl daemon-reload
sudo systemctl restart docker

3、验证是否生效

docker info | grep -A 3 "Registry Mirrors"

输出中如果包含以下信息,则说明镜像源配置成功:

Registry Mirrors:
 https://mirror.ccs.tencentyun.com/

在这里插入图片描述

但此时通过命令 docker search mysql 查看相应版本信息时依然报超时错误。

在这里插入图片描述

这个时候就需要查看是否是服务器出口访问受限或者是 DNS 配置异常。
4、测试是否能直连 Docker Hub

curl -v https://index.docker.io/v1/

如果输出包含 HTTP/1.1 200 OK,说明可以访问。但此时我们发现一直处于连接中的状态:

在这里插入图片描述

5、测试 DNS 解析

nslookup index.docker.io

dig index.docker.io

看是否能解析出 IP 地址。此处可以 IP 地址是可以正常解析的:

在这里插入图片描述

6、查看当前 DNS 设置

cat /etc/resolv.conf

在这里插入图片描述

此处可以看到 nameserver 是腾讯云的默认内网 DNS,也没有问题,无需修改。
那最终能确定问题可能出在:
Docker Hub(index.docker.io)国外服务器被防火墙或路由策略阻断导致。这是国内腾讯云机器非常常见的问题:Ping、nslookup 都通,但访问 https://index.docker.io(443 端口)超时。
表现就是现在的错误:

dial tcp 64.13.192.74:443: i/o timeout

解决方法

Docker 搜索(docker search) 默认走的是 Docker Hub API(index.docker.io),而不是镜像加速器镜像源(registry)。所以即使设置了 "registry-mirrors",docker search 仍可能访问不到。
所以有两个选择:

1、直接拉取镜像

不再用 docker search,直接拉取镜像。例如拉取 MySQL:

docker pull mysql:8.0.43-debian

注意:腾讯云镜像加速器支持加速拉取,但不支持 docker search。也就是说我们可以按刚才的配置,拉镜像没问题,但搜索会超时。

2、使用国内镜像站搜索镜像

如果非要先搜索一下,再决定是否要拉取的话,就只能通过国内的一些镜像站先搜索,再去拉取,以下是一个在 GitHub 维护的仓库,里面有不少镜像站,大家可以搜索看看:

在上面搜索 mysql,可以找到对应版本,然后复制镜像拉取命令。

Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐