红光丽华 發表於 2025-12-26 10:19:56

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li><a href="#_label0">前言</a></li><li><a href="#_label1">一、问题现象与核心原因</a></li><ul class="second_class_ul"><li><a href="#_lab2_1_0">常见报错</a></li><li><a href="#_lab2_1_1">核心原因</a></li></ul><li><a href="#_label2">二、分步解决流程</a></li><ul class="second_class_ul"><li><a href="#_lab2_2_2">第一步:配置国内镜像加速源</a></li><li><a href="#_lab2_2_3">第二步:修复 Docker 守护进程 DNS 解析问题</a></li><li><a href="#_lab2_2_4">第三步:配置 Docker 守护进程代理(科学上网)</a></li></ul><li><a href="#_label3">总结</a></li><ul class="second_class_ul"></ul></ul></div><p class="maodian"><a name="_label0"></a></p><h2>前言</h2>
<p>Docker 网络相关问题(如拉取镜像、搜索镜像时超时或报错)是使用过程中常见的困扰,尤其国内用户常受官方镜像源访问慢、DNS 解析异常等问题影响。本文将详细梳理问题根源,提供从镜像加速、DNS 配置到代理设置的完整解决流程,帮你彻底解决相关网络故障。</p>
<p class="maodian"><a name="_label1"></a></p><h2>一、问题现象与核心原因</h2>
<p class="maodian"><a name="_lab2_1_0"></a></p><h3>常见报错</h3>
<ul><li><p>拉取镜像时卡顿超时,始终停留在 &ldquo;Pulling from xxx&rdquo; 阶段。</p></li></ul>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025122610151281.png" /></p>
<ul><li><p>明确报错:<code>Error response from daemon: Get &quot;https://index.docker.io/v1/search?q=ubuntu&amp;n=25&quot;: dial tcp: lookup index.docker.io on 127.0.0.53:53: server misbehaving</code>。</p></li><li><p>配置国内加速源后,问题仍未解决,镜像仍优先尝试连接官方源 <code>https://registry-1.docker.io/v2/</code>。</p></li></ul>
<p class="maodian"><a name="_lab2_1_1"></a></p><h3>核心原因</h3>
<ol><li><p>国内网络访问 Docker 官方镜像源存在天然限制,速度慢且易中断。</p></li><li><p>Docker 守护进程与容器的 DNS 配置相互独立,容器 DNS 配置不影响守护进程拉取镜像时的 DNS 解析。</p></li><li><p>Docker 守护进程不会继承终端的代理环境变量,需单独配置代理才能通过科学上网访问镜像源。</p></li></ol>
<p class="maodian"><a name="_label2"></a></p><h2>二、分步解决流程</h2>
<p class="maodian"><a name="_lab2_2_2"></a></p><h3>第一步:配置国内镜像加速源</h3>
<p>国内加速源仅作为官方源的辅助加速通道,无法解决 DNS 或网络访问限制问题,但能提升后续访问成功率。</p>
<ol><li><p>编辑 Docker 守护进程配置文件:</p></li></ol>
<div class="jb51code"><pre class="brush:json;">sudo tee /etc/docker/daemon.json &lt;&lt;-'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</pre></div>
<p>2.重新加载配置并重启 Docker:</p>
<div class="jb51code"><pre class="brush:ps;"> sudo systemctl daemon-reload &amp;&amp; sudo systemctl restart docker</pre></div>
<p>后来才发现 docker还是首先去其官方拉取 &quot;<a href="https://registry-1.docker.io/v2/" rel="external nofollow" title="https://registry-1.docker.io/v2/">https://registry-1.docker.io/v2/</a>&quot; ,我们所谓的国内加速源是起到一个辅助加速作用。</p>
<p>我们的daemon.json 配得没问题了之后,再去运行拉取,发现还是报错了。</p>
<div class="jb51code"><pre class="brush:ps;">Error response from daemon: Get "https://index.docker.io/v1/search?q=ubuntu&amp;n=25": dial tcp: lookup index.docker.io on 127.0.0.53:53: server misbehaving</pre></div>
<p>这时候我们会想是不是 DNS域名 解析的问题。 我们一般会又去检查 daemon.json文件,然后给它添加域名解析</p>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025122610151268.png" /></p>
<p>会发现还是会报错,重启docker之后也还会。 这时候就可以发现其实是我们的docker的守护进程的问题,是<strong>Docker 守护进程自己在用 127.0.0.53 这个 DNS</strong>,而不是你在 daemon.json 里配的那些 <code>8.8.8.8</code> / <code>223.5.5.5</code>。</p>
<p><code>&quot;dns&quot;: [...]</code> 这项只影响 容器里的 <code>/etc/resolv.conf</code>, 但是 Docker 守护进程拉镜像时的 DNS 仍走的是宿主机的 <code>/etc/resolv.conf</code>(现在是 127.0.0.53,那就是 systemd-resolved 的 stub)。</p>
<p>然后我们就需要去更改宿主机里面的设置。</p>
<p class="maodian"><a name="_lab2_2_3"></a></p><h3>第二步:修复 Docker 守护进程 DNS 解析问题</h3>
<p>Docker 守护进程拉取镜像时使用的是宿主机的 <code>/etc/resolv.conf</code> 配置,而非 <code>daemon.json</code> 中的 <code>dns</code> 字段,需通过修改系统 DNS 解决解析异常。</p>
<ol><li><p>编辑系统 DNS 配置文件</p></li></ol>
<div class="jb51code"><pre class="brush:ps;">sudo nano /etc/systemd/resolved.conf</pre></div>
<p>把里面改成类似这样(没有就加,有就改):</p>
<div class="jb51code"><pre class="brush:ps;">
DNS=8.8.8.8 223.5.5.5 114.114.114.114
FallbackDNS=1.1.1.1
# 可选:如果你有本地默认域,就留着;没有就可以注释掉
# Domains=~.</pre></div>
<p>(2)重启 systemd-resolved:</p>
<div class="jb51code"><pre class="brush:ps;">sudo systemctl restart systemd-resolved</pre></div>
<p>(3) 确认现在 DNS 正常工作:</p>
<div class="jb51code"><pre class="brush:ps;">resolvectl status
resolvectl query index.docker.io</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025122610151242.png" /></p>
<p>这样的话,说明我们已经把DNS解析的问题弄好了。</p>
<p>(4)再重启 Docker:</p>
<div class="jb51code"><pre class="brush:ps;">sudo systemctl restart docker</pre></div>
<p>(5)再试一次 Docker 搜索:</p>
<div class="jb51code"><pre class="brush:ps;">sudo docker search ubuntu</pre></div>
<p>但是发现还是报错了,这时候就需要 <strong>科学上网了</strong>。</p>
<p class="maodian"><a name="_lab2_2_4"></a></p><h3>第三步:配置 Docker 守护进程代理(科学上网)</h3>
<p>(1)先确认自己的虚拟机里面开代理是否能访问<strong>Docker Hub</strong>:</p>
<div class="jb51code"><pre class="brush:ps;"># 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&amp;n=5" -v
</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025122610151285.png" /></p>
<p>若 curl 命令返回 200 状态码且能获取搜索结果,说明终端代理有效。</p>
<p>(2)给 Docker 守护进程配置 HTTP/HTTPS 代理</p>
<p>Docker 是一个 systemd 服务,它不会自动继承你终端里的 <code>export http_proxy</code>, 要 <strong>单独给 <code>dockerd</code> 配置环境变量</strong>。</p>
<p>创建配置目录:</p>
<div class="jb51code"><pre class="brush:ps;">sudo mkdir -p /etc/systemd/system/docker.service.d</pre></div>
<p>新建代理配置文件:</p>
<div class="jb51code"><pre class="brush:ps;">sudo nano /etc/systemd/system/docker.service.d/http-proxy.conf</pre></div>
<p>写入</p>
<div class="jb51code"><pre class="brush:ps;">
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"</pre></div>
<p>让 systemd 重新加载服务配置并重启 Docker:</p>
<div class="jb51code"><pre class="brush:ps;">sudo systemctl daemon-reload
sudo systemctl restart docker</pre></div>
<p>验证 <code>dockerd</code> 确实带上了代理环境变量:</p>
<div class="jb51code"><pre class="brush:ps;">systemctl show docker | grep -i environment</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025122610151270.png" /></p>
<p>发现ok</p>
<p>再试一次 docker search</p>
<div class="jb51code"><pre class="brush:ps;">sudo docker search ubuntu</pre></div>
<p style="text-align:center"><img alt="" src="https://img.jbzj.com/file_images/article/202512/2025122610151233.png" /></p>
<p>问题解决。</p>
<p class="maodian"><a name="_label3"></a></p><h2>总结</h2>
<p>到此这篇关于Docker拉取镜像/搜索失败问题彻底解决方案的文章就介绍到这了,更多相关Docker拉取镜像搜索失败问题内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
頁: [1]
查看完整版本: Docker拉取镜像/ 搜索失败问题的彻底解决方案