出于某种原因,我无法让Docker与Dockerhub通信;某些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服务在我的机器上运行?我的网络似乎没有其他任何问题.
我已经尝试配置我的网络连接以使用谷歌的DNS(8.8.8.8),但这没有任何区别.
更新
奇怪的是,我无法ping index.docker.io,但如果我尝试在浏览器中导航,我会被重定向到hub.docker.com.
更新
我现在可以确认这只发生在酒店的一个局域网上.我不知道他们在做什么,或者为什么它只影响Docker,而不是Git或Bittorrent或任何其他连接工具.
您入住的酒店的本地网络可能使其网络寻址与Docker创建的虚拟网络发生冲突.我在公司网络中发布了同样的类型.
最简单(但没有很好记录)的修复是强制Docker使用’–bip’参数为虚拟局域网使用任意网络地址.在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.这将允许数据包正确路由出去.