web-dev-qa-db-ja.com

同じホスト上の異なるネットワーク内のDockerコンテナ間での通信

同じホスト内の異なるネットワークでコンテナを作成して通信する可能性はありますか?現在、docker-composeを使用していないことに注意してください。

以下は私がしたことの要約です。次のコマンドを使用して2つのネットワークを作成しました

docker network create --driver bridge mynetwork1   
docker network create --driver bridge mynetwork2

次に、コマンドを使用して、これらの作成されたネットワークのそれぞれで2つのコンテナーを実行しました。

docker run --net=mynetwork1 -it name=mynet1container1 mycontainerimage
docker run --net=mynetwork1 -it name=mynet1container2 mycontainerimage
docker run --net=mynetwork2 -it name=mynet2container1 mycontainerimage
docker run --net=mynetwork2 -it name=mynet2container2 mycontainerimage

次に、を使用して作成されたネットワークから、各コンテナのIPアドレスを特定しました。

docker network inspect mynetwork1
docker network inspect mynetwork2

それらを使用して、同じネットワーク内のコンテナー間で通信することはできましたが、ネットワークを介してコンテナー間で通信することはできませんでした。同じネットワークにコンテナを追加するだけで通信が可能でした。

どうもありがとう...

13
Abraham Jaison

Iptablesはそのようなパケットをドロップするため、異なるネットワーク内のコンテナは相互に通信できません。これは、フィルターテーブルのDOCKER-ISOLATION-STAGE-1チェーンとDOCKER-ISOLATION-STAGE-2チェーンに表示されます。

    Sudo iptables -t filter -vL

ルールをDOCKER-USERチェーンに追加して、異なるネットワーク間の通信を可能にすることができます。上記のシナリオでは、次のコマンドにより、mynetwork1の任意のコンテナーがmynetwork2の任意のコンテナーと通信できるようになります。

ネットワークのブリッジインターフェイス名(mynetwork1およびmynetwork2)を最初に見つける必要があります。それらの名前は通常br-07d0d51191dfまたはbr-85f51d1cfbf6のようになり、コマンド「ifconfig」または「iplinkshow」を使用して見つけることができます。複数のブリッジインターフェイスがあるため、対象のネットワークに適切なものを識別するには、ブリッジインターフェイスのinetアドレス(ifconfigに表示)がコマンド 'docker network inspectmynetwork1'に表示されるサブネットアドレスと一致する必要があります。

    Sudo iptables -I DOCKER-USER -i br-########1 -o br-########2 -j ACCEPT
    Sudo iptables -I DOCKER-USER -i br-########2 -o br-########1 -j ACCEPT

ルールは、特定のIP間の通信のみを許可するように微調整できます。例えば、

    Sudo iptables -I DOCKER-USER -i br-########1 -o br-########2 -s 172.17.0.2 -d 172.19.0.2 -j ACCEPT
    Sudo iptables -I DOCKER-USER -i br-########2 -o br-########1 -s 172.19.0.2 -d 172.17.0.2 -j ACCEPT
4
Jay

問題

同じネットワーク上にないため、2つのコンテナは通信できません。

解決策a)

1つのコンテナを他のネットワークオーバーレイに接続します(これは、現在の制約を満たさない場合があります)。

解決策b)

3番目のネットワークを作成し、両方のコンテナーをこのネットワークに接続します。

方法

コマンド docker runオプションのオカレンスを1つだけ受け入れる--net、あなたがしなければならないことはdocker startコンテナ、次にdocker network connect共有ネットワークにそれらを。


あなたが探している答えはここにあります: https://stackoverflow.com/a/34038381/5321002

4
Auzias

DockerDocsによるとContainers can only communicate within networks but not across networksコンテナを2つのネットワークに接続して、その方法で通信できるようにすることができます。

編集:その時点で、そもそもなぜ2つのネットワークがあるのか​​。

リンクは次のとおりです。

https://docs.docker.com/engine/userguide/networking/dockernetworks/

-ブルース

0
CompSciGuy139