OPは彼の問題の回避策を見つけてこの問題を解決しましたが、根本的な問題は見つかりませんでした。 Docker のデフォルトのブリッジ ネットワーク bridge
が インターネットと airflowsetup_default
に接続されています これは、Docker ネットワークのセットアップに問題があることを示唆するものではありません。
私はいくつかの調査を行い、Fedora 32 は、Docker が動作するかどうかはあまり気にしないと判断しました。
ドキュメンテーションに記載されている方法で Docker をインストールすることさえできず、Fedora が提供するパッケージをインストールしても正しく動作しません。この問題に関する詳細については、ここ、ここ、およびここを参照してください。
主な問題は、コンテナーがカスタム ブリッジ ネットワークに接続されている場合 (それが docker network create
を使用して作成されたかどうかに関係なく)、コンテナー内にインターネット接続がないことです。 または docker-compose によって。
理由は簡単です。Docker は OS が使用するファイアウォールが iptables であると想定していますが、Fedora 32 はデフォルトで firewalld を使用します。つまり、Docker は手動でファイアウォールを構成することはできません。手動で構成する必要があります。
参考までに、最初に Fedora 32 のクリーン インストールで Docker をセットアップする方法を説明します。
最初に次のコマンドを実行します:
sudo grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0"
sudo groupadd docker
sudo usermod -aG docker $USER
これにより、cgroup が Docker デーモンと互換性を持つように構成され、ユーザーは sudo なしで Docker CLI を使用できるようになります。
次に、システムを再起動して変更を適用し、実行します:
sudo dnf install -y moby-engine docker-compose nano
sudo systemctl enable docker
sudo systemctl start docker
Docker をインストールして有効にします。
docker-compose.yml
を含むディレクトリに移動します。 docker-compose up -d
を実行します . Yuo には docker-compose
が表示されるはずです ネットワークを作成してからコンテナを作成します。コンテナーが起動時にインターネット接続を必要とする場合 (OP など)、起動に失敗します。
sudo iptables-save | grep DOCKER
を実行します 次のように表示されます:
:DOCKER - [0:0]
:DOCKER-ISOLATION-STAGE-1 - [0:0]
:DOCKER-ISOLATION-STAGE-2 - [0:0]
:DOCKER-USER - [0:0]
-A FORWARD -j DOCKER-USER
-A FORWARD -j DOCKER-ISOLATION-STAGE-1
-A FORWARD -o docker0 -j DOCKER
-A FORWARD -o br-b56fa303f315 -j DOCKER
-A DOCKER-ISOLATION-STAGE-1 -i docker0 ! -o docker0 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -i br-b56fa303f315 ! -o br-b56fa303f315 -j DOCKER-ISOLATION-STAGE-2
-A DOCKER-ISOLATION-STAGE-1 -j RETURN
-A DOCKER-ISOLATION-STAGE-2 -o docker0 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -o br-b56fa303f315 -j DROP
-A DOCKER-ISOLATION-STAGE-2 -j RETURN
-A DOCKER-USER -j RETURN
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A DOCKER -i docker0 -j RETURN
-A DOCKER -i br-b56fa303f315 -j RETURN
docker0
は Docker のデフォルトのブリッジ ネットワークですが、br-b56fa303f315
は docker-compose
によって作成された新しいネットワークです (あなたのものは別の名前を持っているかもしれません)。 OS が iptables
を使用していた場合 すべてが期待どおりに機能しますが、そうではないため、docker0
の構成を確認する必要があります。 firewalld
で .
firewall-cmd --get-active-zones
を実行 次のようなものが得られます:
docker
interfaces: docker0
public
interfaces: eth0 eth1
bridge
であることがわかります ネットワークは docker
にあります ゾーンですが、新しいネットワークはそうではありません。実際、それはまったくリストされていません。つまり、デフォルト ゾーンにあるということです。 firewall-cmd --get-default-zone
を実行すると、それが何であるかを確認できます . Fedora 32 のクリーン インストールでは、public
です。 .
実行します (br-b56fa303f315
を置き換えることを忘れないでください) あなたのインターフェース名と一緒に):
sudo firewall-cmd --zone=docker --add-interface=br-b56fa303f315
docker-compose up -d
を実行 以前にサービスの開始に失敗した場合、出来上がり - コンテナーにはネットワーク接続があります。
残念ながら、システムを再起動すると、接続が再び失われます。
以下を使用してこれを防ぐことができます:
sudo firewall-cmd --permanent --zone=docker --add-interface=br-b56fa303f315
sudo firewall-cmd --reload
ただし、新しいネットワークを作成するか、既存のネットワークを再作成する場合 (たとえば、docker-compose down
を実行して) そして docker-compose up -d
もう一度) このプロセスを繰り返す必要があります。
では、この問題の解決策は何ですか?
まず、現在デフォルト ゾーンに接続されているすべてのネットワーク インターフェイスを書き留めます。この例では eth0
です。 と eth1
.
次に、以下を実行します (public
を置き換えます) をデフォルトのゾーンの名前に置き換えます)
sudo firewall-cmd --set-default-zone=docker
sudo firewall-cmd --permanent --zone=public --add-interface=eth0
sudo firewall-cmd --permanent --zone=public --add-interface=eth1
sudo firewall-cmd --reload
これで、以前にデフォルト ゾーンにあったインターフェイスが再び存在するはずですが、すべての新しいインターフェイス (したがってすべての新しい Docker ネットワーク) は自動的に docker
に追加されます。 これにより、完全なネットワーク接続が提供されます。