CentOSにdocker-ce
の最新リリースをインストールしましたが、-隣接するサーバーから公開されたポートに到達できないおよび外部に到達できないからコンテナ自体。
NetworkManagerとFirewallDを有効にしてVanilla CentOS 8を実行する。デフォルトのファイアウォールゾーンはpublic
です。
バージョン:
docker-ce
19.03.3(公式のDocker RPM)containerd.io
1.2.6(CentOS 7の公式Docker RPM-CentOS 8ではまだ使用できません)数日かけて関連コンポーネントのログと構成を確認した後、タオルを投入してFedora 30に戻したところ、箱から出してすぐに機能するようです。
ファイアウォールに重点を置いて、firewalld
を無効にすることでうまくいくように思えるが、私はそれを望まないことに気づいた。 iptables
を使用してネットワークルールを検査しているときに、nftables
への切り替えにより、iptables
が、nftables
ルールのごく一部のみを示す抽象化レイヤーになっていることがわかりました。つまり、すべてではないにしても、firewalld
構成のほとんどがiptables
のスコープ外で適用されます。
私はiptables
で真実全体を見つけることができたので、慣れるまでに時間がかかります。
要するに、これが機能するためには、マスカレードを有効にする必要がありました。 dockerd
がiptables
を介してすでにこれを行っているように見えましたが、iptables
マスカレードが機能するには、ファイアウォールゾーンで特に有効にする必要があります。
# Masquerading allows for docker ingress and egress (this is the juicy bit)
firewall-cmd --zone=public --add-masquerade --permanent
# Specifically allow incoming traffic on port 80/443 (nothing new here)
firewall-cmd --zone=public --add-port=80/tcp
firewall-cmd --zone=public --add-port=443/tcp
# Reload firewall to apply permanent rules
firewall-cmd --reload
dockerd
を再起動または再起動すると、入力と出力の両方が機能するはずです。
以前の回答に欠けているのは、最初に構成するゾーンにdockerインターフェイスを追加する必要があるという事実です。 public(または提案された「信頼された」ゾーンに追加 here ですが、セキュリティの観点からは賢明ではないでしょう)。デフォルトではゾーンに割り当てられていないためです。完了したら、必ずdockerデーモンをリロードしてください。
# Check what interface docker is using, e.g. 'docker0'
ip link show
# Check available firewalld zones, e.g. 'public'
Sudo firewall-cmd --get-active-zones
# Check what zone the docker interface it bound to, most likely 'no zone' yet
Sudo firewall-cmd --get-zone-of-interface=docker0
# So add the 'docker0' interface to the 'public' zone. Changes will be visible only after firewalld reload
Sudo nmcli connection modify docker0 connection.zone public
# Masquerading allows for docker ingress and egress (this is the juicy bit)
Sudo firewall-cmd --zone=public --add-masquerade --permanent
# Optional open required incomming ports (wasn't required in my tests)
# Sudo firewall-cmd --zone=public --add-port=443/tcp
# Reload firewalld
Sudo firewall-cmd --reload
# Reload dockerd
Sudo systemctl restart docker
# Test ping and DNS works:
docker run busybox ping -c 1 172.16.0.1
docker run busybox cat /etc/resolv.conf
docker run busybox ping -c 1 yourhost.local
FirewallBackend変数を再びiptablesに変更しました。
このアップデートでは、nftablesフィルタリングサブシステムは、firewalldデーモンのデフォルトのファイアウォールバックエンドです。バックエンドを変更するには、/ etc/firewalld.confファイルのFirewallBackendオプションを使用します。
リンク: Centos8 Deprecated_functionality
この行動の変化に関する情報はあまりありません。 Dockerが使用しようとするiptablesルールの一部は、CentOS8のログによれば機能しません。
警告:COMMAND_FAILED: '/ usr/sbin/iptables -w10 -D FORWARD -i docker0 -o docker0 -j DROP' failed:iptables:Bad rule(does match a matching rule exists in that chain?).