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から、ping
172.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
@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
私はこれを自動的に行うためのハックしていない方法をまだ見つけていません。
Dockerネットワークは相互にルーティングするようには設計されておらず、意図的に分離されているため、相互にのみ通信できるアプリケーションのグループを作成できます。これはiptablesルールで実行されると思いますが、それについて私に引用しないでください。
ただし、複数のネットワークにコンテナを追加できます。手動でこれを行うには、コンテナーの作成後にdocker network connect Docker_network_2 Container_1
コマンドを使用します(エントリーポイントが開始する前にネットワークに接続する必要がある場合は、runコマンドをcreateコマンドとstartコマンドに分割できます)。
Docker composeは、さまざまなネットワーク間で複数のコンテナーを一緒に配線するのに役立ちます。これにより、各コンテナが属する各ネットワークを定義できるため、複数のdocker network connect
コマンドを実行する必要がなくなります。
Dockerがiptablesに設定するDOCKER-ISOLATION
チェーンを削除することで問題を解決しました:
# iptables --flush DOCKER-ISOLATION
これがセキュリティの観点から正しいアプローチであるかどうかはわかりませんが、私が必要としていることを行います。