docker容器中的不同dns条目比host

时间:2017-08-17 10:26:48

标签: docker docker-networking

当我从我的ubuntu系统ping一个url时,它会正确解析为所需服务器的IP。当我在容器中执行相同的操作时,它会解析为其他一些IP(我认为它是一个旧的dns条目)。

有谁知道为什么会发生这种情况以及如何解决这个问题?

--------- ----------更新

我使用以下命令运行容器:

docker run -it -v $(pwd):/data-storage dotnet-testbed /bin/bash

Ping Google工作:

PING google.com (172.217.19.174): 56 data bytes 64 bytes from 172.217.19.174: icmp_seq=0 ttl=54 time=4.537 ms

ping myUrl显示错误的ip并被卡住: PING myUrl (**.***.***.**): 56 data bytes

2 个答案:

答案 0 :(得分:1)

您可能会发现以下技术可用于调查Docker容器如何解析主机...

搜索hosts database

 docker run alpine getent hosts stackoverflow.com       
151.101.1.69      stackoverflow.com  stackoverflow.com

检查hosts file

 docker run alpine cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3  6a431f90415d

docker run --add-host显式检查添加到容器主机文件中的主机:

 docker run --name=my_cool_container -i -d --add-host stackoverflow.com:127.0.0.1 alpine sh
 docker inspect -f '{{range $index, $value := .HostConfig.ExtraHosts}}{{$value}}
{{end}}' my_cool_container
stackoverflow.com:127.0.0.1

但也许这与Docker没什么关系。您应该在容器内运行ifconfig并检查其DNS服务器是否与主机相同。您还可以使用dig检查收到的DNS答案。

如果这是容器中的“旧DNS条目”(容器通常是短暂的),我会感到非常惊讶。如果是这样的话:您可以通过重新部署容器(或学习如何清除其DNS缓存)来解决这个问题。

最有可能的是:您的主机使用的是某些代理,但容器却没有。默认情况下,Docker容器使用桥接网络。如果您switch it to use host networking:容器将使用您主机的网络堆栈。这可能足以让它从您的代理中受益。

答案 1 :(得分:0)

你是代理人吗?...你可以在你的容器中将http_proxy设置为环境变量..或者作为构建purpouses的参数传递