Docker CentOS8、Fedoraでコンテナからホストを使用できない問題の解決方法
このせいで、少なくとも合計24時間は費やした気がする……nginxの設定の問題だと思って、修正して修正して……それでもずっと動かなくて……テスト用のものを一つ作って、設定を一つずつ追加しながら、また再インストールして……何度も繰り返して……それでたどり着いた結論について説明したい。 コンテナからホストへの接続ができない
このせいで、少なくとも合計24時間は費やした気がする……nginxの設定の問題だと思って、修正して修正して……それでもずっと動かなくて……テスト用のものを一つ作って、設定を一つずつ追加しながら、また再インストールして……何度も繰り返して……それでたどり着いた結論について説明したい。 コンテナからホストへの接続ができない
このせいで、少なくとも合計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動かない。
コンテナ間のホストの問題(?) とにかく、このようなことが起きるらしい。
そこで見つけたのが、以下のリンクだ。
そこで、これで解決した。実際に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に設定されている。
そして、コンテナ間のホスト接続もうまくいく……しかし、、、ただ、、、ただ、、ただ!!!!!!!!!
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のような別のネットワークを作成しているなら、追加したネットワークも必ず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で適用すればよさそうだ。