如何调试不适用于Docker容器的DNS?
我开始使用Docker容器,但从容器中解析DNS时遇到问题。 在StackOverflow上似乎有许多类似于此问题的问题,但我无法解决它 我在CentOS Linux 7.7.1908主机上。 我在这台机器上构建了一个新容器,并将其添加到现有的docker-compose.yml文件中 但我的容器中似乎缺少了一些东西——DNS在其中不起作用。 从docker compose启动的其他容器没有此问题 在docker compose中,我的新容器的开头和DNS工作的现有容器看起来是一样的,类似于以下内容:如何调试不适用于Docker容器的DNS?,docker,dns,docker-compose,centos7,Docker,Dns,Docker Compose,Centos7,我开始使用Docker容器,但从容器中解析DNS时遇到问题。 在StackOverflow上似乎有许多类似于此问题的问题,但我无法解决它 我在CentOS Linux 7.7.1908主机上。 我在这台机器上构建了一个新容器,并将其添加到现有的docker-compose.yml文件中 但我的容器中似乎缺少了一些东西——DNS在其中不起作用。 从docker compose启动的其他容器没有此问题 在docker compose中,我的新容器的开头和DNS工作的现有容器看起来是一样的,类似于以下
existingcontainer:
image: johnson/job1:2.1.0
environment:
JAVA_OPTS: " -Xms256m -Xmx512m"
ports:
- 8090:8090
newcontainer:
image: johnson/job2:1.0.0
environment:
JAVA_OPTS: " -Xms256m -Xmx512m"
ports:
- 8091:8090
容器启动后,其中的功能都可以正常工作,但新容器中的DNS不起作用
docker container exec existingcontainer_1 ping google.com
PING google.com (172.217.12.238) 56(84) bytes of data.
...
docker container exec newcontainer_1 ping google.com
ping: google.com: Name or service not known
docker container exec newcontainer_1 ping 172.217.12.238
PING google.com (172.217.12.238) 56(84) bytes of data.
...
因此,DNS解析不适用于newcontainer,但可以通过IP地址访问internet。我的结论是容器中缺少一些配置
docker container exec existingcontainer_1 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.15 2a51cabe0eaf
docker container exec newcontainer_1 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.11 0c73f229b689
docker container exec existingcontainer_1 cat /etc/resolv.conf
search ec2.internal
nameserver 127.0.0.11
options ndots::0
docker container exec newcontainer_1 cat /etc/resolv.conf
search ec2.internal
nameserver 127.0.0.11
options ndots::0
DNS的网络配置看起来相同。根据一些文章,我在docker.service文件中添加了以下ExecStart设置,以强制DNS服务器,然后重新启动docker和docker compose容器:
--dns 8.8.8.8
但我看到了同样的行为——DNS在新容器上不起作用。另外,由于DNS已经在一些容器中工作,但不是新的容器,所以我认为正确的解决方案不是这样的全局解决方案——似乎需要对新容器进行更改
docker container exec existingcontainer_1 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.15 2a51cabe0eaf
docker container exec newcontainer_1 cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.18.0.11 0c73f229b689
docker container exec existingcontainer_1 cat /etc/resolv.conf
search ec2.internal
nameserver 127.0.0.11
options ndots::0
docker container exec newcontainer_1 cat /etc/resolv.conf
search ec2.internal
nameserver 127.0.0.11
options ndots::0
为了对容器进行故障排除,我还发现容器环境中似乎没有许多标准实用程序,如netstat和iptables。我可以把这些从主机复制到容器中吗
如何最好地调试它?我在Centos 8中遇到了类似的问题。看起来firewalld和docker之间存在冲突。这里有一个。我禁用了firewalld,这允许在容器中查找DNS。但这似乎不是一个好的解决方案。我们需要弄清真相 下面解决了这个问题 对centos 8防火墙所做的更改将覆盖iptables配置,从而中断docker网络。它需要手动启用伪装
firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --reload
systemctl restart docker
这为我解决了问题我在Centos 8上也遇到了类似的问题。看起来firewalld和docker之间存在冲突。这里有一个。我禁用了firewalld,这允许在容器中查找DNS。但这似乎不是一个好的解决方案。我们需要弄清真相 下面解决了这个问题 对centos 8防火墙所做的更改将覆盖iptables配置,从而中断docker网络。它需要手动启用伪装
firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --reload
systemctl restart docker
这就解决了我的问题约翰逊/job2:1.0.0的基本Docker映像是什么?它与约翰逊/job1相同。它包括一个java环境。您是否尝试过运行类似于
nslookup example.com 8.8.8
?我尝试过,但我发现nslookup不在容器中(此实用程序文件也不在有效的容器中)。我将尝试从主机复制一些bin实用程序。如果您仍然可以使用IP地址(例如,ping 8.8.8.8
)连接到internet,那么您的DNS配置几乎肯定会有问题。johnson/job2:1.0
)的基本Docker映像是什么?它与johnson/job1相同。它包括一个java环境。您是否尝试过运行类似于nslookup example.com 8.8.8
?我尝试过,但我发现nslookup不在容器中(此实用程序文件也不在有效的容器中)。我将尝试从主机复制一些bin实用程序。如果您仍然可以使用IP地址(例如,ping 8.8.8.8
)连接到internet,那么您的DNS配置几乎肯定会出现问题。谢谢-此问题发生在重新启动我的ec2主机后。谢谢-此问题发生在重新启动我的ec2主机后。