ホームページ  >  記事  >  バックエンド開発  >  Docker コンテナ内の WebSocket サーバーに外部から接続できないのはなぜですか?

Docker コンテナ内の WebSocket サーバーに外部から接続できないのはなぜですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-11-06 13:29:03490ブラウズ

Why Can't I Connect to My WebSocket Server Inside a Docker Container from Outside?

WebSocket サーバーの Docker 化のトラブルシューティング

問題:

次の場合に、Docker コンテナーで実行されている WebSocket サーバーへの接続が困難になるコンテナの外部からアクセスします。

サーバー コード:

// server.go
func RootHandler(w http.ResponseWriter, r *http.Request) {
    ... (WebSocket handling code) ...
}

Dockerfile:

FROM golang:1.11.4-alpine3.8
... (Build and expose port commands) ...

期待される動作:

コンテナの外部から WebSocket サーバーに接続すると、クライアント側で「接続済み」と表示されるはずです。

実際のエラー:

クライアントは次のエラーでパニックになります:「パニック: 読み取り tcp [::1]:60328->[::1]:8000: 読み取り: ピアによって接続がリセットされました。」

原因:

サーバーはコンテナ内のローカルホスト (127.0.0.1) でリッスンしていますが、コンテナの外部からはアクセスできません。

解決策:

この問題を解決するには、server.go のサーバーのリッスン アドレスを「localhost:8000」ではなく「:8000」に変更します。このように、サーバーはコンテナのすべての IP アドレスをリッスンします。

// server.go
func RootHandler(w http.ResponseWriter, r *http.Request) {
    ... (WebSocket handling code) ...
}

// main()
server := http.Server{Addr: ":8000"}
... (Rest of server setup) ...

追加情報:

  • Docker は、iptables ルールを作成してポートを公開します。トラフィックをコンテナの IP アドレスに転送します。
  • Docker コンテナは通常、docker0 ネットワーク インターフェイス内の IP アドレスを取得します。
  • コンテナの外部から接続すると、トラフィックはコンテナの IP アドレスに転送されます。サーバーのリッスン アドレスと一致しません。

以上がDocker コンテナ内の WebSocket サーバーに外部から接続できないのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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