Docker pull无法在127.0.1.1:53上查找index.docker.io(无法解封DNS消息)。

5

由于某种原因,我无法让Docker与Dockerhub通信;search和pull命令因某些DNS相关的原因而失败。例如:

$ docker pull redis
Pulling repository redis
Get https://index.docker.io/v1/repositories/library/redis/images: dial tcp: lookup index.docker.io on 127.0.1.1:53: cannot unmarshal DNS message

我的网络连接很好。我可以ping 127.0.1.1,那是本地主机地址吗?是否有一种特定于DockerHub的DNS服务在我的计算机上运行可能出现了故障?我的网络似乎没有其他问题。

我尝试将我的网络连接配置为使用Google的DNS(8.8.8.8),但没有任何改变。

更新

奇怪的是,我无法ping index.docker.io,但如果我尝试在浏览器中导航到那里,我会被重定向到hub.docker.com。

更新

我现在可以确认这只发生在一个旅馆的局域网上。我不知道他们在做什么,或者为什么它只影响Docker,而不影响Git或Bittorrent或其他任何连接工具。


你的网络连接有代理吗? - VonC
我之前使用的是Google的DNS,地址为8.8.8.8,但我已经尝试禁用它了。我现在在一家大型酒店里,如果他们对网络流量进行奇怪的处理,我也不会感到惊讶。 - Dan Ross
你是直接在Linux主机上使用Docker会话,还是在Windows或Mac上使用Linux虚拟机? - VonC
是的,这就是在Linux上使用Docker而不需要虚拟机。 - Dan Ross
这边也是,有关于此的任何更新或解决方法吗? - bitgandtter
我只在一个酒店的 WiFi 上遇到过这个问题。那里,整整一个星期我都能稳定地复现它 :( 但是自从那以后我就没有再遇到这个问题了。自然而然,我指责过于复杂的局域网,却并没有真正理解它的原因。 - Dan Ross
1个回答

3
这个问题有点老了,但因为它仍然没有答案,而我碰巧遇到了它,那么就来回答一下吧。您所住酒店的本地网络可能与 Docker 创建的虚拟网络地址发生冲突。我在企业网络中也遇到了同样的问题。
最简单(但文档不是很好)的解决方法是使用“--bip”参数强制 Docker 使用任意网络地址作为虚拟局域网。在 Linux 上,通常很容易通过编辑 /etc 下的 Docker 配置来实现,但在 Mac 上(以防万一有人碰巧遇到此问题),找到要更改的文件特别困难。如果您遇到这种情况,请仔细阅读 https://github.com/docker/docker/issues/25064
基本上,您需要找到一个未在您所连接的网络上使用的网络段。Docker 默认会尝试这样做:它将使用第一个私有 CIDR,该 CIDR 不与任何网络接口冲突。但是,如果您位于通过另一个私有段路由的私有 LAN 段上,则 Docker 无法看到它,并可能最终创建具有冲突 CIDR 的本地网络,从而阻止数据包路由出去。
以下是说明的示例:
你的IP地址可能是192.168.10.2,子网掩码为/24。这个网络可能有一个默认网关在192.168.10.1/24上,但是该网关通过另一台地址为172.17.1.1的路由器进行路由。
Docker会注意到192.168.10.0/24正在使用,并创建一个使用172.16.0.0/16地址的虚拟网络-因此,您的容器将尝试本地路由该CIDR下的所有地址,并永远无法到达172.17.1.1外部路由器。在这种情况下,您需要将--bip更改为不同的内容,比如说10.0.0.1/16。这样可以正确地路由数据包。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接