Docker 在 CentOS8、Fedora 上容器无法使用 Host 的问题解决方法。
因为这个问题,感觉至少耗费了整整 24 个小时……我以为是 nginx 配置的问题,于是改了又改……但还是一直不行……我先做了一个用于测试的环境,然后每次只设置一项,再重新安装……就这样不断重复……所以我想说明一下最终得出的结论。 容器与 Host 之间无法连接的问题。 在 CentOS8、Fedora 上安装 Doc
因为这个问题,感觉至少耗费了整整 24 个小时……我以为是 nginx 配置的问题,于是改了又改……但还是一直不行……我先做了一个用于测试的环境,然后每次只设置一项,再重新安装……就这样不断重复……所以我想说明一下最终得出的结论。 容器与 Host 之间无法连接的问题。 在 CentOS8、Fedora 上安装 Doc
因为这个问题,感觉至少耗费了整整 24 个小时……我以为是 nginx 配置的问题,于是改了又改……但还是一直不行……我先做了一个用于测试的环境,然后每次只设置一项,再重新安装……就这样不断重复……所以我想说明一下最终得出的结论。
在 CentOS8、Fedora 上安装 Docker 后,尝试输入下面的命令:
docker run busybox nslookup google.com
nslookup: write to '108.61.10.10': No route to host
;; connection timed out; no servers could be reached
docker run yauritux/busybox-curl curl google.com行不通。
据说是容器与 Host 之间的问题(?),总之就是出现了这种情况。
于是我找到了下面这个链接。
所以,我用这个方法解决了。实际上,dnf install 也能正常运行,nslookup 也没有问题。
firewall-cmd --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: ens3
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
masquerade: yes
forward-ports:
source-ports:
icmp-blocks:
rich rules:masquerade: yes 已经设为 yes。
而且,容器与 Host 之间的连接也正常……但是……但……但!!!!!!!!!!!!!!!
即使在 nginx.conf 中配置了获取 x-real-ip,
或者使用 traefik,也绝对无法获取 X-REAL-IP。
即使能获取到,也无论如何都会得到类似 "172.19.0.1" 这样的 docker network ip。
修改 "etc/firewalld/firewalld.conf" 的方法。
将 FirewallBackend=nftables
修改为 FirewallBackend=iptables。
firewall-cmd --permanent --zone=trusted --add-interface=docker0
firewall-cmd --reload通过命令应用设置。
这样一来,在执行 docker build 时运行 dnf install host 等操作,以及其他所有连接都能正常工作。但是!!
如果我的 docker-compose service 中已经创建了 frontend 或 backend 之类的其他 network,那么也一定要把新增的网络添加到 trusted 区域中。
否则,在使用 traefik 时会出现以下错误。
'502 Bad Gateway' caused by: dial tcp 172.18.0.4:80: connect: no route to host# ifconfig
br-d193b7e58cd8: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.18.0.1 netmask 255.255.0.0 broadcast 172.18.255.255
inet6 fe80::42:17ff:fed7:dc73 prefixlen 64 scopeid 0x20<link>
ether 02:42:17:d7:dc:73 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
br-e34899da24a1: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.19.0.1 netmask 255.255.0.0 broadcast 172.19.255.255
inet6 fe80::42:61ff:fe06:9f0c prefixlen 64 scopeid 0x20<link>
ether 02:42:61:06:9f:0c txqueuelen 0 (Ethernet)
RX packets 41 bytes 2757 (2.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 73 bytes 6079 (5.9 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:6dff:fe00:e5f1 prefixlen 64 scopeid 0x20<link>
ether 02:42:6d:00:e5:f1 txqueuelen 0 (Ethernet)
RX packets 12831 bytes 722769 (705.8 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 18098 bytes 98702867 (94.1 MiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0firewall-cmd --permanent --zone=trusted --add-interface=br-d193b7e58cd8
firewall-cmd --permanent --zone=trusted --add-interface=br-e34899da24a1
firewall-cmd --reload因此……如上所示,把对应的网络接口也添加进去即可。
firewall-cmd --list-all-zones
public (active)
target: default
icmp-block-inversion: no
interfaces: ens3
sources:
services: cockpit dhcpv6-client ssh
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
trusted (active)
target: ACCEPT
icmp-block-inversion: no
interfaces: br-d193b7e58cd8 br-e34899da24a1 docker0
sources:
services:
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:这样设置后,现在就可以正常获取 X-REAL-IP 了。

似乎有人说这个问题是因为 docker 不支持 nftables 才导致的……
总之……希望以后能够支持,并由官方修复这个问题。
目前……能这样解决,总算是万幸。

使用 firewall-cmd --permanent --zone=public --add-masquerade
应用时

firewall-cmd --permanent --zone=trusted --add-interface=docker0
firewall-cmd --permanent --zone=trusted --add-interface=br-87014b87949d
firewall-cmd --permanent --zone=trusted --add-interface=br-fb2316a253cd
firewall-cmd --reload这样应用应该就可以了。