docker 容器中的 dns 条目与主机不同
Different dns entries in docker container than host
当我从我的 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
您使用代理吗?...您可以将 http_proxy 设置为容器中的环境变量 .. 或作为构建目的的参数传递
您可能会发现以下技术有助于研究您的 Docker 容器如何解析主机…
搜索 hosts database:
docker run alpine getent hosts whosebug.com
151.101.1.69 whosebug.com whosebug.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 whosebug.com:127.0.0.1 alpine sh
docker inspect -f '{{range $index, $value := .HostConfig.ExtraHosts}}{{$value}}
{{end}}' my_cool_container
whosebug.com:127.0.0.1
但也许这与Docker没有太大关系。您应该 运行 ifconfig
在容器内并检查其 DNS 服务器是否与您的主机相同。您还可以使用 dig
检查它收到的 DNS 应答。
如果这是容器中的"old DNS entry",我会感到非常惊讶(容器通常是短暂的)。如果是这样:您可以通过重新部署容器(或学习如何清除其 DNS 缓存)来解决该问题。
最有可能:您的主机使用了一些代理,但容器没有。默认情况下,Docker 容器使用桥接网络。如果你 switch it to use host 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
您使用代理吗?...您可以将 http_proxy 设置为容器中的环境变量 .. 或作为构建目的的参数传递
您可能会发现以下技术有助于研究您的 Docker 容器如何解析主机…
搜索 hosts database:
docker run alpine getent hosts whosebug.com
151.101.1.69 whosebug.com whosebug.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 whosebug.com:127.0.0.1 alpine sh
docker inspect -f '{{range $index, $value := .HostConfig.ExtraHosts}}{{$value}}
{{end}}' my_cool_container
whosebug.com:127.0.0.1
但也许这与Docker没有太大关系。您应该 运行 ifconfig
在容器内并检查其 DNS 服务器是否与您的主机相同。您还可以使用 dig
检查它收到的 DNS 应答。
如果这是容器中的"old DNS entry",我会感到非常惊讶(容器通常是短暂的)。如果是这样:您可以通过重新部署容器(或学习如何清除其 DNS 缓存)来解决该问题。
最有可能:您的主机使用了一些代理,但容器没有。默认情况下,Docker 容器使用桥接网络。如果你 switch it to use host networking: 容器将使用你主机的网络堆栈。这可能足以让它从您的代理中受益。