docker

关注公众号 jb51net

关闭
首页 > 网站技巧 > 服务器 > 云和虚拟化 > docker > Docker拉取镜像搜索失败问题

Docker拉取镜像/ 搜索失败问题的彻底解决方案

作者:Zainakl

近期docker官方镜像拉取经常容易出现网络超时,这篇文章主要介绍了Docker拉取镜像/ 搜索失败问题的彻底解决方案,文中通过代码介绍的非常详细,需要的朋友可以参考下

前言

Docker 网络相关问题(如拉取镜像、搜索镜像时超时或报错)是使用过程中常见的困扰,尤其国内用户常受官方镜像源访问慢、DNS 解析异常等问题影响。本文将详细梳理问题根源,提供从镜像加速、DNS 配置到代理设置的完整解决流程,帮你彻底解决相关网络故障。

一、问题现象与核心原因

常见报错

核心原因

  1. 国内网络访问 Docker 官方镜像源存在天然限制,速度慢且易中断。

  2. Docker 守护进程与容器的 DNS 配置相互独立,容器 DNS 配置不影响守护进程拉取镜像时的 DNS 解析。

  3. Docker 守护进程不会继承终端的代理环境变量,需单独配置代理才能通过科学上网访问镜像源。

二、分步解决流程

第一步:配置国内镜像加速源

国内加速源仅作为官方源的辅助加速通道,无法解决 DNS 或网络访问限制问题,但能提升后续访问成功率。

  1. 编辑 Docker 守护进程配置文件:

sudo tee /etc/docker/daemon.json <<-'EOF'
{
    "registry-mirrors": [
        "https://docker.m.daocloud.io",
        "https://docker.imgdb.de",
        "https://docker-0.unsee.tech",
        "https://docker.hlmirror.com",
        "https://docker.1ms.run",
        "https://func.ink",
        "https://lispy.org",
        "https://docker.xiaogenban1993.com"
    ]
}
EOF

2.重新加载配置并重启 Docker:

 sudo systemctl daemon-reload && sudo systemctl restart docker

后来才发现 docker还是首先去其官方拉取 "https://registry-1.docker.io/v2/" ,我们所谓的国内加速源是起到一个辅助加速作用。

我们的daemon.json 配得没问题了之后,再去运行拉取,发现还是报错了。

Error response from daemon: Get "https://index.docker.io/v1/search?q=ubuntu&n=25": dial tcp: lookup index.docker.io on 127.0.0.53:53: server misbehaving

这时候我们会想是不是 DNS域名 解析的问题。 我们一般会又去检查 daemon.json文件,然后给它添加域名解析

会发现还是会报错,重启docker之后也还会。 这时候就可以发现其实是我们的docker的守护进程的问题,是Docker 守护进程自己在用 127.0.0.53 这个 DNS,而不是你在 daemon.json 里配的那些 8.8.8.8 / 223.5.5.5

"dns": [...] 这项只影响 容器里的 /etc/resolv.conf, 但是 Docker 守护进程拉镜像时的 DNS 仍走的是宿主机的 /etc/resolv.conf(现在是 127.0.0.53,那就是 systemd-resolved 的 stub)。

然后我们就需要去更改宿主机里面的设置。

第二步:修复 Docker 守护进程 DNS 解析问题

Docker 守护进程拉取镜像时使用的是宿主机的 /etc/resolv.conf 配置,而非 daemon.json 中的 dns 字段,需通过修改系统 DNS 解决解析异常。

  1. 编辑系统 DNS 配置文件

sudo nano /etc/systemd/resolved.conf

把里面改成类似这样(没有就加,有就改):

[Resolve]
DNS=8.8.8.8 223.5.5.5 114.114.114.114
FallbackDNS=1.1.1.1
# 可选:如果你有本地默认域,就留着;没有就可以注释掉
# Domains=~.

(2)重启 systemd-resolved:

sudo systemctl restart systemd-resolved

(3) 确认现在 DNS 正常工作:

resolvectl status
resolvectl query index.docker.io

这样的话,说明我们已经把DNS解析的问题弄好了。

(4)再重启 Docker:

sudo systemctl restart docker

(5)再试一次 Docker 搜索:

sudo docker search ubuntu

但是发现还是报错了,这时候就需要 科学上网了

第三步:配置 Docker 守护进程代理(科学上网)

(1)先确认自己的虚拟机里面开代理是否能访问Docker Hub

# 1. 开启终端代理
export http_proxy="http://127.0.0.1:7890"
export https_proxy="http://127.0.0.1:7890"

# 2. 用 curl 直接请求 Docker Hub 的 search 接口
curl "https://index.docker.io/v1/search?q=ubuntu&n=5" -v

若 curl 命令返回 200 状态码且能获取搜索结果,说明终端代理有效。

(2)给 Docker 守护进程配置 HTTP/HTTPS 代理

Docker 是一个 systemd 服务,它不会自动继承你终端里的 export http_proxy, 要 单独给 dockerd 配置环境变量

创建配置目录:

sudo mkdir -p /etc/systemd/system/docker.service.d

新建代理配置文件:

sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf

写入

[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1,::1"

让 systemd 重新加载服务配置并重启 Docker:

sudo systemctl daemon-reload
sudo systemctl restart docker

验证 dockerd 确实带上了代理环境变量:

systemctl show docker | grep -i environment

发现ok

再试一次 docker search

sudo docker search ubuntu

问题解决。

总结

到此这篇关于Docker拉取镜像/搜索失败问题彻底解决方案的文章就介绍到这了,更多相关Docker拉取镜像搜索失败问题内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文