GNU/Linux >> Linux の 問題 >  >> Linux

DockerコンテナはFedora 32でインターネットに接続できませんか?

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-b56fa303f315docker-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 に追加されます。 これにより、完全なネットワーク接続が提供されます。


Linux
  1. なぜ誰もがDockerを使用しているのですか?

  2. Jconsole が接続できない

  3. Docker コマンドが Docker デーモンに接続できない

  1. Docker(およびLinuxコンテナー)とは何ですか?

  2. DockerComposeの使用方法

  3. Dockerコンテナを接続する方法

  1. Dockerコンテナを一覧表示する方法

  2. Dockerコンテナの概要

  3. Docker 内の Docker はボリュームをマウントできません