docker swarm 中的容器无法解析外部地址的 dns

Containers in docker swarm cannot resolve dns of external addresses

这个问题研究了很久,还是苦于找不到解决办法。任何正确方向的指示将不胜感激。

Host machine OS - CentOS 8. 使用VMWare Fusion Pro,VM在NAT后面。为了简单起见,没有工作节点,只有这个管理节点。

swarm服务在我的CentOS 8 VM上创建如下-

docker service create  -d -p 80:80 nginx

服务创建成功,可以看到nginx主页

但是,我无法从容器内部执行 curl google.com

以下是一些事实和我失败的尝试 -

我已经更改 /etc/docker/daemon.json 以包含以下内容,然后重新启动 docker 服务 -

{
    "dns": ["8.8.8.8"]
}

如果我创建单独的 docker 容器(docker 容器 运行 ..)正确解析 dns,我在那里没有问题。请参阅以下代码段 -

root@e180d56ab94a:/# cat /etc/resolv.conf 
search localdomain
nameserver 8.8.8.8
root@e180d56ab94a:/# curl google.com
<HTML><HEAD><meta http-equiv="content-type" content="text/html;charset=utf-8">
<TITLE>301 Moved</TITLE></HEAD><BODY>
<H1>301 Moved</H1>
The document has moved
<A HREF="http://www.google.com/">here</A>.
</BODY></HTML>

但是从 docker 服务创建的容器不进行 dns 解析。

我的主机 IP 是 192.168.112.135,我主机的 resolv.conf 说名称服务器是 192.168.112.2,我容器的 IP 是 10.0.0.14。所以我猜这里没有 IP 重叠,因此可以排除在此线程 https://github.com/moby/moby/issues/27399 中发现问题的可能性。

我的主机的 resolv.conf 看起来像这样 -

$ cat /etc/resolv.conf 
# Generated by NetworkManager
search localdomain
nameserver 192.168.112.2

基于,我也尝试了以下但无济于事-

docker service create --dns 192.168.112.2  -d -p 80:80 nginx

docker 检查容器显示以下代码段

:
:
"DNSConfig": {
                 "Nameservers": [
                            "192.168.112.2"
                        ]
                    },
:
:

但这也不起作用。 这也没有用

docker service create --dns 8.8.8.8  -d -p 80:80 nginx

我已经允许 docker0 通过防火墙 -

$ sudo firewall-cmd --permanent --zone=trusted --add-interface=docker0

$ sudo firewall-cmd --reload

如果我 运行 在 AWS 中的 EC2 实例上执行相同的命令,容器可以毫无问题地解析 dns。

问题可以在我的虚拟机上重现。还尝试了不同的安装 - CentOS 8 最小安装以及完整安装。

已经做了很多次 - 重新启动docker服务、网络、主机,使节点离开 swarm 并重新启动 swarm。

我错过了什么?

这对我有用

看看这个 link。 问题出在 centos8 firewalld,因为它默认将 FirewallBackend 设置为 nftables。将其更改为 iptables 有效。

https://github.com/docker/for-linux/issues/957#issuecomment-627166787