Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何调试不适用于Docker容器的DNS?_Docker_Dns_Docker Compose_Centos7 - Fatal编程技术网

如何调试不适用于Docker容器的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工作的现有容器看起来是一样的,类似于以下

我开始使用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主机后。