Docker配置镜像源 解决拉取镜像超时 ERROR: failed to solve xx: : failed to resolve source metadata for docker.io/li
分析问题:
我在构建镜像时报错:ERROR: failed to solve: golang:1.21: failed to resolve source metadata for docker.io/library/golang:1.21: failed to do request: Head \"https://registry-1.docker.io/v2/library/golang/manifests/1.21\": dial tcp 202.160.128.205:443: i/o timeout
排查原因,是构建过程中拉取镜像时出现了超时问题。
这表明 Docker 无法从 Docker Hub 中拉取镜像,原因是国内网络访问Docker Hub 会被限制。
解决方式:
这里直接说解决办法,想看具体原理分析的我写在本文末尾了。
解决方式是配置 Docker 使用国内镜像源(如阿里云、腾讯云、华为云),步骤如下:
- 编辑 Docker 配置文件(通常在 /etc/docker/daemon.json),添加以下内容:
{ \"registry-mirrors\": [ \"https://.mirror.aliyuncs.com\", \"https://mirror.baidubce.com\", \"https://docker.m.daocloud.io\" ]}
注意其中的需要替换为你自己的阿里云id,获取阿里云id的步骤如下:
-
保存后重启 Docker:
sudo systemctl daemon-reloadsudo systemctl restart docker
-
验证配置:
docker info --format \'{{.RegistryConfig.Mirrors}}\'
最后测试一下:
原理分析:
Doceker 在拉取镜像时,会默认直接连接官方仓库 Docker Hub (地址为 registry-1.docker.io)进行拉取,因为官方仓库是在国外的,所以会出现超时问题。
镜像源是 Docker 配置的代理服务(通常由云厂商如阿里云、腾讯云提供),用于加速从Docker Hub中下载镜像。
若我们配置了镜像源(默认是没有配置的),Docker 会优先尝试通过这些源拉取镜像,失败后再回退到用官方仓库。
所以,我们的解决办法是配置镜像源,Docker 通过这些镜像源作为代理,成功拉取了Docker Hub中的镜像。