Dockerがサブネットをブリッジネットワークとして使用しないようにするか、ルーティング例外を追加する方法

Dockerがサブネットをブリッジネットワークとして使用しないようにするか、ルーティング例外を追加する方法

私は複数のドッカー化されたアプリケーションを実行しているドッカーホスト(CentOs7)を持っており、今後はさらに多くなるでしょう。問題は、172.18.100.101アドレスを使用してホストからアクセスする必要がある外部サービスがあることです。

Dockerは、生成されたブリッジネットワーク(172.18.x、172.19.xなど)にサブネットを自動的に割り当てます。

Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.x.x.x        0.0.0.0         UG    0      0        0 eth0
172.17.1.0      0.0.0.0         255.255.255.0   U     0      0        0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-0a7f3df38b5c
172.19.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-636432c82f83

表示されるオプション:
1. Dockerに、172.18.0.0サブネットをブリッジとして使用しないように指示します。 Dockerではこれは可能ではないと思います。
2. ドッカーコンテナごとにサブネットの指定を開始できます。ただし、競合しないことを確認する必要があり、docker-compose.ymlファイルがホスト間で共有されるため、これは非常に問題になります。したがって、これは管理にとって悪夢です。 。
3. 172.18.0.0 サブネットがまだ存在している間、ホストから目的の IP (172.18.100.101) を別々にルーティングしてみました。これが可能かどうかはわかりません。パスを追加してみましたが、役に立ちませんでした。それはおそらく、以前ではなく172.18.0.0の規則の後に追加されたためでしょう。

$ sudo route add -host 172.18.100.101 dev eth0
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         10.x.x.x        0.0.0.0         UG    0      0        0 eth0
172.17.1.0      0.0.0.0         255.255.255.0   U     0      0        0 docker0
172.18.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-0a7f3dfsudo ip route show to match 172.18.198.12038b5c
172.18.100.101  0.0.0.0         255.255.255.255 UH    0      0        0 eth0
172.19.0.0      0.0.0.0         255.255.0.0     U     0      0        0 br-636432c82f83

どんなアイデアがありますか?問題は、選択したIP(またはサブネット)の「例外」パスを追加し、デフォルトのルールより前に適用されることを確認する方法のようです。

編集(2018-06-21):Dockerコンテナのtaサービスに接続しようとしても問題ありません。私の問題は、IP 172.18.100.101を使用する私のネットワーク(私が所有/制御していない他のサーバー)にサービスがありますが、このホストでDockerが自動的に172.18 .0.0の範囲を割り当てるため、そのホストから接続できないことです。です。したがって、172.18.100.101へのすべての接続試行は、対応する外部ホストではなくDockerによって生成されたブリッジに送信されます。

答え1

Dockerbridgeネットワーキングは、ネットワーキングを構成するための多くのオプションの1つにすぎません。これDockerネットワークドキュメントコンテナとの通信に使用できるさまざまなネットワークプラグインがリストされています。

Dockerコンテナのサービスにのみ接続する必要がある場合は、Dockerポートに接続されているホストでサービスポートを開くことができ、ネットワークを台無しにする可能性があります。 Dockerはこれを「公開ポート」と呼び、フラグ付きdocker runのコマンドに使用されます。 Dockerコンテナに直接接続する必要はありません。--publish-p

ただし、コンテナに直接接続する場合は、Dockerを介して設定できます。

編集:元の質問がホストルーティングに関するものであると誤解しました。

ホスト ルーティングに関して Docker を使用すると、使用するネットワーク範囲を変更できます。これを使用してdockerネットワークを作成する場合、docker0インターフェイスを設定できます。目的の範囲に関係なく、現在ネットワークで使用されていない範囲を選択する必要があります。

ネットワークを作成する場合は、プロジェクトファイルでネットワーク範囲を設定するdocker-compose必要があります。docker-compose.yml

答え2

プレフィックスが大きいパス(172.18.100.101ホストパスなど)は、プレフィックスが小さいパス(dockerによって追加された/ 16パスなど)よりも優先順位が高くなります。したがって、初期のアプローチが機能するはずです。ただし、172.18.100.101から直接アクセスできない場合は、ゲートウェイも指定する必要がありますeth0

たとえば、

ip route add 172.18.100.101/32 via 10.x.x.x dev eth0

関連情報