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