0

我开始使用 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 解析不适​​用于新容器,但可以通过 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 已经在某些容器中运行,但不是在新容器中运行,所以我认为正确的修复不是这样的全球性的——似乎需要对新容器进行更改。

为了对容器进行故障排除,我还发现一些标准实用程序在容器环境中似乎不可用,例如 netstat 和 iptables。我可能只是将这些从主机复制到容器?

如何最好地调试这个?

4

1 回答 1

2

我遇到了与 Centos 8 类似的问题。看起来 firewalld 和 docker 之间存在冲突。这是一个参考。我禁用了 firewalld 并允许在容器中发现 DNS。不过,这似乎不是一个好的解决方案。需要深入了解它

……

下面的帖子解决了这个问题。

对 centos 8 防火墙所做的更改会覆盖 iptables 配置,从而破坏 docker 网络。它需要手动启用伪装。

firewall-cmd --zone=public --add-masquerade --permanent
firewall-cmd --reload
systemctl restart docker

为我解决了这个问题

于 2020-06-13T01:33:43.987 回答