これは私が今しばらく解決しようとしている問題です。私はできる限り多くのリソースを試しましたが、まだ何もうまくいきませんでした。 :/
これが私が取り組もうとしていることです:
Dockerコンテナーをデプロイして、同じローカルネットワークにあるマシンからそれらにアクセスできるようにしたい。つまり、Dockerがコンテナーに配布するIPアドレスは、Dockerをホストするコンピューターと同じLAN上のクライアントコンピューターから到達可能である必要があります。
理想的には、次のように、DockerネットワークのゲートウェイとしてDockerホストを指すルートを追加するだけで済みます。
client@lan$ Sudo route add -net <docker-network>/<mask> gw <docker-Host>
そしてブーム、彼らはIPを入力するだけでコンテナにアクセスできます。もちろん、このルートはルーターから設定することもできます。
ネットワークブリッジがこれを行うのに役立つことはわかりましたが、このように機能させることはできませんでした。
これらすべてをどのように機能させるのですか?
Dockerコンテナー内のアプリケーションがネットワーク上の他のホストから到達可能であることを確認するだけの場合は、Dockerネットワークモードをホストに設定するのが最も簡単です。
docker run --net=Host image/toRun:1.0
これにより、ホストのIPアドレス上のイメージ内のポートが公開されます(ポートの衝突を回避するようにしてください)
以下を使用してDockerホストでIPv4転送を有効にする限り、ホストを介してコンテナーに到達するためのルートをクライアントに追加することは機能するはずです。
sysctl -w net.ipv4.ip_forward=1
ただし、適切なファイアウォールがないと、トラフィックが任意のインターフェイスから任意のインターフェイスにルーティングされるため、セキュリティへの影響に注意してください。
これは、「ブリッジアダプタではない」から「ブリッジアダプタ」へのトラフィックを受け入れるようにDOCKER-USER
チェーンを設定した場合に機能します。オプションで、tcpポート80(-p tcp --dport 80
)などのプロトコルとポートに制限されます。このチェーンは、FORWARD
テーブルのfilter
チェーンから呼び出され、(Docker)ホスト宛てではなく、ホストを介してルーティングされるパケットを管理します。
次に、ゲートウェイとして機能するDockerホストを介してDockerネットワークをルーティングするために、LANルーターを静的ルートで構成する必要があります。ルーターは、この情報を使用して3つのことを実行できます。
コンテナ宛てのトラフィックに対してICMPREDIRECTパケットを送信します。
DHCPリースで静的ルートを配布する(オプション121)
Dockerホストを介してパケットをルーティングしますが、これはルートの非対称性につながります:クライアント→ルーター→ホスト→コンテナー、応答はコンテナー→ホスト→クライアントになります。
これらのどちらも私には本当に魅力的なオプションのようには思えません。