分析问题:

我在构建镜像时报错: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 使用国内镜像源(如阿里云、腾讯云、华为云),步骤如下:

  1. 编辑 Docker 配置文件(通常在 /etc/docker/daemon.json),添加以下内容:
    {
      "registry-mirrors": [
        "https://<your-aliyun-id>.mirror.aliyuncs.com",
        "https://mirror.baidubce.com",
        "https://docker.m.daocloud.io"
      ]
    }

    注意其中的<your-aliyun-id>需要替换为你自己的阿里云id,获取阿里云id的步骤如下:

  2. 保存后重启 Docker:

    sudo systemctl daemon-reload
    sudo systemctl restart docker

  3. 验证配置:

    docker info --format '{{.RegistryConfig.Mirrors}}'

最后测试一下:

原理分析:

Doceker 在拉取镜像时,会默认直接连接官方仓库 Docker Hub (地址为 registry-1.docker.io)进行拉取,因为官方仓库是在国外的,所以会出现超时问题。

镜像源是 Docker 配置的代理服务(通常由云厂商如阿里云、腾讯云提供),用于加速从Docker Hub中下载镜像。

若我们配置了镜像源(默认是没有配置的),Docker 会优先尝试通过这些源拉取镜像,失败后再回退到用官方仓库。

所以,我们的解决办法是配置镜像源,Docker 通过这些镜像源作为代理,成功拉取了Docker Hub中的镜像。


 

Logo

一站式 AI 云服务平台

更多推荐