在使用 Docker 构建服务时遇到了从 registry-1.docker.io 拉取 redis 镜像超时的问题。这个错误通常与网络连接问题有关,特别是国内用户访问 Docker 官方仓库(Docker Hub)时经常遇到。别担心,我们来一步步解决。

💎 首先,快速了解一下问题的核心
Docker 默认从 Docker Hub(registry-1.docker.io)拉取镜像。对于国内用户,由于网络延迟或限制,直接访问可能会非常慢甚至超时。解决方案的核心是配置国内镜像加速器


🔧 解决方案一览

问题类型 解决思路 关键命令/操作(摘要)
网络连接问题 检查网络连通性,确保能访问外网和 DNS 解析正常 ping www.baidu.comnslookup registry-1.docker.io
镜像源配置 配置 Docker 国内镜像加速器 修改 /etc/docker/daemon.json,添加 registry-mirrors
DNS 配置 修改 DNS 服务器为更稳定的公共 DNS 修改 /etc/resolv.conf,添加 nameserver 8.8.8.8 等
代理配置 如有稳定代理,为 Docker 配置代理 创建 /etc/systemd/system/docker.service.d/http-proxy.conf
离线构建 通过中介设备下载镜像后导入 docker save 和 docker load 命令

📌 详细解决步骤

1. 检查网络连接和 DNS 解析

首先确保你的服务器可以正常访问互联网,并且域名解析正常。

  • 测试网络连通性

    bash

    ping -c 4 www.baidu.com

    如果无法 ping 通,检查你的服务器网络设置、防火墙或网关配置。

  • 测试 Docker Hub 域名解析

    bash

    nslookup registry-1.docker.io

    如果解析失败或耗时很长,问题可能出在 DNS 上。

2. 配置 Docker 国内镜像加速器(推荐首选方案)

这是解决国内用户拉取 Docker 镜像慢或超时问题最有效且最常用的方法137。

  1. 创建或修改 Docker 的配置文件

    bash

    sudo tee /etc/docker/daemon.json <<-'EOF'
    {
      "registry-mirrors": [
        "https://docker.1panel.live",
        "https://docker.m.daocloud.io",
        "https://dockerproxy.com",
        "https://mirror.baidubce.com",
        "https://docker.nju.edu.cn",
        "https://docker.mirrors.ustc.edu.cn"
      ]
    }
    EOF

    💡 提示

    • 这里提供了多个镜像源地址,Docker 会按顺序尝试,如果一个失效会自动切换下一个3。

    • 你可以根据网络情况选择性地使用或添加其他镜像源,例如阿里云镜像加速器(需要注册后获取专属加速器地址)69。

  2. 重新加载配置并重启 Docker 服务

    bash

    sudo systemctl daemon-reload
    sudo systemctl restart docker
  3. 验证镜像加速器是否生效

    bash

    docker info | grep -A 10 "Registry Mirrors"

    如果输出中包含了刚才配置的镜像源地址,说明配置成功。

3. 检查并修正 DNS 配置

如果域名解析有问题,可以尝试修改系统的 DNS 服务器。

  • 编辑 /etc/resolv.conf 文件

    bash

    sudo vi /etc/resolv.conf
  • 添加可靠的公共 DNS 服务器,例如:

    bash

    nameserver 114.114.114.114   # 国内常用
    nameserver 8.8.8.8           # Google DNS
    nameserver 8.8.4.4           # Google DNS

    保存退出后,可能需要重启网络服务sudo systemctl restart network)或 Docker 服务(sudo systemctl restart docker)以使更改生效。

4. 为 Docker 配置代理(如果你有稳定的代理服务器)

如果你的网络环境需要通过代理服务器才能访问外网,可以为 Docker 服务配置代理。

  1. 创建代理配置文件

    bash

    sudo mkdir -p /etc/systemd/system/docker.service.d
    sudo vi /etc/systemd/system/docker.service.d/http-proxy.conf
  2. 添加代理配置(根据你的代理服务器设置修改):

    ini

    [Service]
    Environment="HTTP_PROXY=http://proxy-ip:proxy-port"
    Environment="HTTPS_PROXY=http://proxy-ip:proxy-port"
    Environment="NO_PROXY=localhost,127.0.0.1,.example.com"  # 可选,指定不走代理的地址

    如果代理需要认证,格式为:http://username:password@proxy-ip:proxy-port

  3. 重启 Docker 服务使配置生效

    bash

    sudo systemctl daemon-reload
    sudo systemctl restart docker
5. 离线构建方案(如果上述方法均无效)

如果服务器完全无法访问外网,可以找一台能正常下载 Docker 镜像的机器(比如你的本地开发机),先拉取镜像,然后导出并传输到目标服务器上加载。

  1. 在能联网的机器上拉取镜像并导出

    bash

    docker pull redis
    docker save -o redis.tar redis
  2. 将 redis.tar 文件传输到目标服务器(使用 scprsync 或 U 盘等):

    bash

    scp redis.tar user@your-server-ip:/path/to/directory/
  3. 在目标服务器上加载镜像

    bash

    docker load -i /path/to/directory/redis.tar

    之后再进行 Docker 构建时,由于镜像已本地存在,就不会再从网络拉取了。


💡 其他可能有用的建议

  • 尝试不同的国内镜像源:不同的网络运营商和环境对各个镜像源的加速效果可能不同,如果某个源速度不理想,可以尝试换一个13。

  • 耐心重试:有时可能是临时的网络波动,可以稍等片刻再重试命令。

  • 查看完整日志:使用 docker build --no-cache --progress=plain . 可以输出更详细的构建信息,有助于诊断问题10。


💎 总结与选择

解决 Docker 拉取镜像超时问题,可以按以下顺序尝试:

  1. 首选:配置国内镜像加速器/etc/docker/daemon.json)137。

  2. 次选:检查并配置可靠的 DNS 服务器/etc/resolv.conf)。

  3. 备选:如果你有稳定的代理服务器,为 Docker 配置代理

  4. 最终方案:如果网络完全受限,采用离线方式传输和加载镜像。

希望这些方法能帮你成功解决问题!如果尝试后仍有疑问,欢迎提供更多信息。

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐