開発者は、Docker を使用して WebSocket サーバーをコンテナ化しようとしているときに問題に遭遇しました。サーバー コードは、「connected」で新しい接続に書き込み、コンテナーの外では正常に機能しますが、Docker コンテナー内に配置すると、クライアントは「接続リセット」エラーによりパニックになり、「read tcp [::1]」というエラー メッセージが表示されます。 :60328->[::1]:8000: 読み取り: ピアによって接続がリセットされました。開発者は、コンテナ内でサーバーへの WebSocket 接続を確立するためにどのような変更が必要かわかりません。
この問題に対処するには、開発者はサーバーのリッスン アドレスを変更する必要があります。 。サーバーがコンテナ内の IP アドレス 127.0.0.1 でリッスンするように制限する「localhost:8000」を使用する代わりに、「:8000」に変更する必要があります。
リッスン アドレスを指定すると、サーバーはコンテナに割り当てられたすべての IP アドレスをリッスンします。この変更により、トラフィックが割り当てられた IP アドレスのコンテナに転送されるときに、接続を受け入れる準備ができているリスニング サーバーが存在することが保証されます。
Docker は、この点で重要な役割を果たします。このシナリオでは、ホスト マシンからコンテナにトラフィックを転送する iptables ルールを作成します。これらのルールは、クライアントがコンテナ内で WebSocket サーバーと通信できるようにするために不可欠です。デフォルトでは、Docker コンテナーは内部 IP アドレスをリッスンしますが、ホスト マシンからは直接アクセスできません。 Docker によって作成された iptables ルールは、この通信ギャップを埋めます。
これらの iptables ルールを表示するには、開発者は次のコマンドを使用できます。
iptables -n -L iptables -t nat -n -L
リッスン アドレスに前述の変更を加え、 Docker の転送機構を理解すると、開発者は Docker コンテナ内でサーバーへの WebSocket 接続を正常に確立でき、「接続リセット」エラーが解決され、クライアント側で「接続済み」を印刷するという期待どおりの動作が可能になります。
以上がDocker化するとWebSocketサーバーが接続に失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。