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

Docker pull fails to lookup index.docker.io on 127.0.1.1:53 (cannot unmarshal DNS message)

出于某种原因,我无法让 Docker 与 Dockerhub 通信; searchpull 命令因某些与 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。那是本地主机地址吗?是否有某种 Docker 集线器特定的 DNS 服务 运行 可能在我的机器上损坏?我的网络似乎没有其他问题。

我已经尝试配置我的网络连接以使用 Google 的 DNS (8.8.8.8),但这没有任何区别。

更新

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

更新

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

问题有点老,但由于它仍然没有答案,而且我碰巧遇到了它,所以就这样了。

您入住酒店的本地网络可能与 Docker 创建的虚拟网络地址冲突。我在公司网发过同款

最简单(但没有很好记录)的修复方法是强制 Docker 使用“--bip”参数为虚拟 LAN 使用任意网络地址。在 Linux 中,这通常很容易通过编辑 /etc 下的 Docker 配置来实现,但是在 Mac 中(以防万一有人无意中发现了这个),很难找到该文件改变。如果是这种情况,请仔细阅读 https://github.com/docker/docker/issues/25064

基本上,您需要找到您所连接的网络上未使用的网段。 Docker 默认情况下会尝试这样做:它将使用第一个不与您的任何网络接口冲突的私有 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。这将允许数据包被正确路由出去。