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

Patricia Arquette
リリース: 2024-11-06 13:29:03
オリジナル
504 人が閲覧しました

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!