ホスト ネットワーク名前空間内の 2 つのコンテナーが同じポートにバインドできるのはなぜですか?

ホスト ネットワーク名前空間内の 2 つのコンテナーが同じポートにバインドできるのはなぜですか?

私は set を使用して Docker コンテナを操作していた--network hostのですが、あるコンテナのポートにバインドすると、同じポートにバインドする 2 番目のコンテナをエラー メッセージなしで起動できることに気付きました。 netstatすると、最初のコンテナの PID ではなく、2 番目のコンテナの PID がリッスン中として表示されます。

再現する手順:

[root@test]# cat /etc/os-release
NAME="Red Hat Enterprise Linux"
VERSION="9.2 (Plow)"
...
[root@test]# docker --version
Docker version 23.0.6, build ef23cbc
[root@test]# docker run -d --rm --network host --name container01 debian nc -l -p 80
7bc250856c7ddde57eb48f57ba800391577c728ec856da24bf80a9df8e766c84

[root@test]# netstat -tulpen | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      0          10435480   2162661/nc

[root@test]# docker run -d --rm --network host --name container02 debian nc -l -p 80
10897d7dea695446db48bff9d3b338554a7cd0535f30625f06b6e5f959bf8df2

[root@test]# netstat -tulpen | grep 80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      0          10436217   2162708/nc

[root@test]# ps auxf
root     2162640  0.0  0.5 720496 10608 ?        Sl   11:03   0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 7bc250856c7ddde57eb48f57ba800391
root     2162661  0.0  0.0   3200  1116 ?        Ss   11:03   0:00  \_ nc -l -p 80
root     2162686  0.0  0.5 720496 10028 ?        Sl   11:03   0:00 /usr/bin/containerd-shim-runc-v2 -namespace moby -id 10897d7dea695446db48bff9d3b33855
root     2162708  0.0  0.0   3200  1060 ?        Ss   11:03   0:00  \_ nc -l -p 80

最初のコンテナへの既存の接続は、2 番目のコンテナが起動された後も機能し続けます。すべての新しい接続は 2 番目のコンテナに送られます。

もちろん、ホスト上の同じポートに直接バインドすることは機能せず、コンテナはホストがすでにリストしているポートにバインドすることもできません。

そこで私の質問は、既存のポート バインディングをコンテナーが上書きできるようにするために、コンテナーに具体的に何が違うのかということです。

答え1

これは、同じクライアントから単一のポートに複数のセッションを持つことができるのとほぼ同じ方法です。接続はソケットペア(一意のクライアント側一時ポートを含む) を使用して、ホスト自身を識別します。ホストは、これらの一意のペアを使用して、トラフィックを正しいプロセス ID に送信します。ホスト ポート自体が別のプロセスによってバインドされた後でも、この処理が行われることがあります。ホストがポートを閉じたり、セッションを終了したり、プロセス ID を終了したりするまで、これらのペアはアクティブなままになります。

ソフトウェアがオペレーティング システムと利用可能なオプションに基づいてポートへの再バインドを許可する方法にはいくつかの制限があります。これに関する詳細とバインド プロセス (Linux の場合) については、次の回答で詳しく説明されています。2 つのアプリケーションが同じポートをリッスンできますか?

関連情報