Maison > développement back-end > Golang > Pourquoi ne puis-je pas me connecter à mon serveur WebSocket à l'intérieur d'un conteneur Docker depuis l'extérieur ?

Pourquoi ne puis-je pas me connecter à mon serveur WebSocket à l'intérieur d'un conteneur Docker depuis l'extérieur ?

Patricia Arquette
Libérer: 2024-11-06 13:29:03
original
671 Les gens l'ont consulté

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

Dépannage de la dockérisation d'un serveur WebSocket

Problème :

Difficulté de connexion à un serveur WebSocket exécuté dans un conteneur Docker lorsque y accéder depuis l'extérieur du conteneur.

Code du serveur :

// server.go
func RootHandler(w http.ResponseWriter, r *http.Request) {
    ... (WebSocket handling code) ...
}
Copier après la connexion

Dockerfile :

FROM golang:1.11.4-alpine3.8
... (Build and expose port commands) ...
Copier après la connexion

Comportement attendu :

La connexion au serveur WebSocket depuis l'extérieur du conteneur doit afficher "connecté" côté client.

Erreur réelle :

Le client panique avec l'erreur : "panic: read tcp [::1]:60328->[::1]:8000: read: connection reset by peer."

Cause :

Le serveur écoute sur localhost (127.0.0.1) dans le conteneur, qui n'est pas accessible depuis l'extérieur du conteneur.

Solution :

Pour résoudre ce problème, modifiez l'adresse d'écoute du serveur dans server.go en ":8000" au lieu de "localhost:8000". De cette façon, le serveur écoutera toutes les adresses IP du conteneur.

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

// main()
server := http.Server{Addr: ":8000"}
... (Rest of server setup) ...
Copier après la connexion

Informations supplémentaires :

  • Docker expose les ports en créant des règles iptables pour transférer le trafic vers l'adresse IP du conteneur.
  • Les conteneurs Docker obtiennent généralement des adresses IP au sein de l'interface réseau docker0.
  • Lors d'une connexion depuis l'extérieur du conteneur, le trafic est transféré vers l'adresse IP du conteneur, ce qui peut ne correspond pas à l'adresse d'écoute du serveur.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal