ホームページ  >  記事  >  バックエンド開発  >  Docker化するとWebSocketサーバーが接続に失敗するのはなぜですか?

Docker化するとWebSocketサーバーが接続に失敗するのはなぜですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-11-06 20:09:02300ブラウズ

Why Does My WebSocket Server Fail to Connect When Dockerized?

WebSocket サーバーの Docker 化

問題

開発者は、Docker を使用して WebSocket サーバーをコンテナ化しようとしているときに問題に遭遇しました。サーバー コードは、「connected」で新しい接続に書き込み、コンテナーの外では正常に機能しますが、Docker コンテナー内に配置すると、クライアントは「接続リセット」エラーによりパニックになり、「read tcp [::1]」というエラー メッセージが表示されます。 :60328->[::1]:8000: 読み取り: ピアによって接続がリセットされました。開発者は、コンテナ内でサーバーへの WebSocket 接続を確立するためにどのような変更が必要かわかりません。

解決策

この問題に対処するには、開発者はサーバーのリッスン アドレスを変更する必要があります。 。サーバーがコンテナ内の IP アドレス 127.0.0.1 でリッスンするように制限する「localhost:8000」を使用する代わりに、「:8000」に変更する必要があります。

リッスン アドレスを指定すると、サーバーはコンテナに割り当てられたすべての IP アドレスをリッスンします。この変更により、トラフィックが割り当てられた IP アドレスのコンテナに転送されるときに、接続を受け入れる準備ができているリスニング サーバーが存在することが保証されます。

Docker の役割

Docker は、この点で重要な役割を果たします。このシナリオでは、ホスト マシンからコンテナにトラフィックを転送する iptables ルールを作成します。これらのルールは、クライアントがコンテナ内で WebSocket サーバーと通信できるようにするために不可欠です。デフォルトでは、Docker コンテナーは内部 IP アドレスをリッスンしますが、ホスト マシンからは直接アクセスできません。 Docker によって作成された iptables ルールは、この通信ギャップを埋めます。

これらの iptables ルールを表示するには、開発者は次のコマンドを使用できます。

iptables -n -L
iptables -t nat -n -L

リッスン アドレスに前述の変更を加え、 Docker の転送機構を理解すると、開発者は Docker コンテナ内でサーバーへの WebSocket 接続を正常に確立でき、「接続リセット」エラーが解決され、クライアント側で「接続済み」を印刷するという期待どおりの動作が可能になります。

以上がDocker化するとWebSocketサーバーが接続に失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。