「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > Docker化するとWebSocketサーバーが接続に失敗するのはなぜですか?

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

2024 年 12 月 23 日に公開
ブラウズ:610

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」に変更する必要があります。

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

Docker の役割

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

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

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

リッスン アドレスに前述の変更を加え、Docker の転送機構を理解することで、開発者は Docker コンテナ内でサーバーへの WebSocket 接続を正常に確立でき、「接続リセット」問題を解決できます。 " エラーが発生し、クライアント側で "connected" を印刷する予期された動作が有効になります。

最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3