web-dev-qa-db-ja.com

同じホストマシン上の異なるDockerネットワーク間のルーティング

2つのDockerネットワークを作成しました。

docker network create --subnet=172.18.0.0/16 Docker_network_1
docker network create --subnet=172.19.0.0/16 Docker_network_2

それらのそれぞれで、2つの異なるコンテナーを実行します。

docker run --rm -it --name Container_1 --net Docker_network_1  Alpine /bin/sh
docker run --rm -it --name Container_2 --net Docker_network_2  Alpine /bin/sh

Container_1はIP 172.18.0.2を持っていますが、Container_2はIP 172.19.0.2を持っています。

Container_1から、ping172.19.0.1に属するDockerインターフェイスIP Docker_network_2を使用できますが、Container_2 IP 172.19.0.2をpingできません。

ホストマシンでの「ルーティング」が正しいように見えるので、なぜかわかりません。

#route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         192.168.0.1     0.0.0.0         UG    1024   0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-ea28cf2d7108
172.19.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-244606ad6705
2
user

@userの答えを追跡する。少し安全な方法は、すべてをフラッシュするのではなく、ネットワークが互いに通信できるようにするルールを追加することです。

これは私のために働いたものです:

Sudo iptables -I DOCKER-ISOLATION-STAGE-2 -o docker0 -i othernet -j ACCEPT
Sudo iptables -I DOCKER-ISOLATION-STAGE-2 -o othernet -i docker0 -j ACCEPT

私はこれを自動的に行うためのハックしていない方法をまだ見つけていません。

2
montjoy

Dockerネットワークは相互にルーティングするようには設計されておらず、意図的に分離されているため、相互にのみ通信できるアプリケーションのグループを作成できます。これはiptablesルールで実行されると思いますが、それについて私に引用しないでください。

ただし、複数のネットワークにコンテナを追加できます。手動でこれを行うには、コンテナーの作成後にdocker network connect Docker_network_2 Container_1コマンドを使用します(エントリーポイントが開始する前にネットワークに接続する必要がある場合は、runコマンドをcreateコマンドとstartコマンドに分割できます)。

Docker composeは、さまざまなネットワーク間で複数のコンテナーを一緒に配線するのに役立ちます。これにより、各コンテナが属する各ネットワークを定義できるため、複数のdocker network connectコマンドを実行する必要がなくなります。

1
BMitch

Dockerがiptablesに設定するDOCKER-ISOLATIONチェーンを削除することで問題を解決しました:

# iptables --flush DOCKER-ISOLATION

これがセキュリティの観点から正しいアプローチであるかどうかはわかりませんが、私が必要としていることを行います。

1
user