我开始使用 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。我可能只是将这些从主机复制到容器?
如何最好地调试这个?