web-dev-qa-db-fra.com

Comment se connecter à un conteneur de menu fixe en dehors de l'hôte (même réseau) [Windows]

J'ai créé mon premier conteneur Docker, il exécute un serveur avec Go, mais je ne peux pas y accéder depuis l'extérieur de l'ordinateur hôte. Je viens juste de commencer avec Docker, alors je suis un peu perdu ici.

Donc, j'ai un code Go très simple qui démarre un serveur, j'ai construit l'image du menu fixe qui installe Go et construit le code dans une image de base Linux. J'exécute le serveur sur le port 8080 et j'expose ce port à l'hôte qui exécute le conteneur de la manière suivante:

docker run -p 8080:8080 dockertest

Cela fonctionne et je peux accéder au serveur via l'IP de la machine de docker (celui qui apparaît sur le Docker Quickstart Terminal lorsqu'il est lancé), le problème est que je ne peux pas accéder au site Web que je suis hébergement de l'extérieur de l'hôte, donc si j'essaie d'ouvrir la même adresse IP sur mon téléphone, cela me donne simplement une erreur: Cette page Web n'est pas disponible (ERR_CONNECTION_TIMED_OUT).

J'ai aussi essayé de spécifier l'adresse IP comme ceci:

docker run -p 192.168.0.157:8080:8080 dockertest

Mais lorsque je le fais, je ne peux accéder au site Web ni par l'adresse IP de l'ordinateur de docker ni par l'adresse IP spécifiée sur la ligne de commande ci-dessus . Je ne sais pas non plus quelle adresse IP je suis censé écrire dans cette commande, mais celle de mon ordinateur. IP, j’ai également essayé 127.0.0.1 (localhost), mais cela m’a donné le même résultat: impossible d’accéder au site Web via une adresse IP quelconque.

J'ai cherché ce problème dans Google et trouvé de nombreuses questions sur StackOverflow, mais aucune ne m'a aidé à résoudre mon problème. La plupart d'entre elles étaient orientées sous Linux ou Mac. La solution ne s'appliquait donc pas à ma situation.

De plus, je peux exécuter le code Go sur mon ordinateur et accéder au site Web à partir d'un autre appareil du même réseau via l'adresse IP de mon ordinateur. Je ne comprends pas pourquoi je ne peux pas y accéder lorsque je l'exécute dans la machine à sous, il m'est apparu que cela pouvait avoir quelque chose à voir avec le transfert IP ou quelque chose d'autre, mais que je suis un noob complet en réseau, je suis principalement un développeur web et n’ai presque aucune expérience en natif.

58
raulsntos

TL; DR Vérifiez le mode réseau de votre hôte VirtualBox - il devrait être bridged si vous souhaitez que la machine virtuelle (et le conteneur Docker qu’il héberge) soit accessible sur votre réseau local.


Il semble que votre confusion réside dans le choix de l'hôte auquel vous souhaitez vous connecter pour accéder à votre application via HTTP. Vous n'avez pas vraiment précisé quelle est votre configuration - je vais faire quelques suppositions, sur la base du fait que vous avez "Windows" et "VirtualBox" dans vos balises.

J'imagine que Docker fonctionne sous une certaine variété de Linux s'exécutant dans VirtualBox sur un hôte Windows. Je vais étiqueter les adresses IP comme suit:

Dl'adresse IP du conteneur Docker

L = l'adresse IP de l'hôte Linux s'exécutant dans VirtualBox

W = l'adresse IP de l'hôte Windows

Lorsque vous exécutez votre application Go sur votre hôte Windows, vous pouvez vous y connecter avec http://W:8080/ à partir de n’importe où sur votre réseau local. Cela fonctionne car l'application Go lie le port 8080 sur la machine Windows et quiconque tente d'accéder au port 8080 à l'adresse IP W sera connecté.

Et voici où cela devient plus compliqué:

VirtualBox, lorsqu’il configure une machine virtuelle (VM), peut configurer le réseau dans l’un des différents modes. Je ne me souviens pas de toutes les différentes options, mais celle que vous voulez est bridged. Dans ce mode, VirtualBox connecte la machine virtuelle à votre réseau local comme s'il s'agissait d'une machine autonome sur le réseau, comme n'importe quelle autre machine connectée à votre réseau. En mode bridged, la machine virtuelle apparaît sur votre réseau comme toute autre machine. D'autres modes configurent les choses différemment et la machine ne sera pas visible sur votre réseau.

Ainsi, si vous configurez correctement la mise en réseau pour l’hôte Linux (bridged), celui-ci aura une adresse IP sur votre réseau local (quelque chose comme 192.168.0.x) et vous pourrez accéder à votre conteneur Docker à http://L:8080/.

Si l'hôte Linux est défini sur un mode autre que bridged, vous _ = pourrez pouvoir accéder à partir de l'hôte Windows, mais cela dépendra du mode dans lequel il se trouve.

EDIT- En fonction des commentaires ci-dessous, cela ressemble beaucoup à la situation décrite ci-dessus.

Sauvegardons un peu: voici comment Docker fonctionne sur mon ordinateur (Ubuntu Linux).

Imaginez que je lance la même commande que vous avez: docker run -p 8080:8080 dockertest. Cela permet de démarrer un nouveau conteneur basé sur l'image dockertest et de transférer (connecter) le port 8080 sur l'hôte Linux (mon PC) sur le port 8080 du conteneur. Docker configure son propre réseau interne (avec son propre ensemble d'adresses IP) pour permettre au démon Docker de communiquer et aux conteneurs de communiquer entre eux. Donc, fondamentalement, avec ce -p 8080:8080, vous connectez le réseau interne de Docker au réseau "externe" - c'est-à-dire. la carte réseau de l'hôte - sur un port particulier.

Avec moi jusqu'à présent? OK, prenons maintenant un peu de recul et examinons votre système. Votre ordinateur exécute Windows - Docker ne s'exécute pas (actuellement) sous Windows. L'outil que vous utilisez a donc configuré un hôte Linux sur un ordinateur virtuel VirtualBox. Lorsque vous faites le docker run dans votre environnement, il se passe exactement la même chose: le port 8080 de l'hôte Linux est connecté au port 8080 du conteneur. La grande différence ici est que votre hôte Windows n'est pas l'hôte Linux sur lequel le conteneur est exécuté. Il existe donc une autre couche et la communication sur cette couche pose des problèmes.

Ce dont vous avez besoin est l’une des deux choses suivantes:

  1. pour connecter le port 8080 sur le VirtualBox VM au port 8080 sur l'hôte Windows, exactement comme si vous connectiez le conteneur Docker au port de l'hôte.

  2. pour connecter la VirtualBox VM directement à votre réseau local avec le mode réseau bridged que j'ai décrit ci-dessus.

Si vous optez pour la première option, vous pourrez accéder au conteneur à http://W:8080W est l'adresse IP ou le nom d'hôte de l'hôte Windows. Si vous optez pour la seconde option, vous pourrez accéder au conteneur à http://L:8080L est l'adresse IP ou le nom d'hôte de la machine virtuelle Linux.

Voilà donc toute l'explication de haut niveau. Vous devez maintenant comprendre comment modifier la configuration de la machine virtuelle VirtualBox. Et voici où je ne peux pas vraiment vous aider - je ne sais pas quel outil vous utilisez pour faire tout cela sur votre ordinateur Windows et je ne suis pas du tout familier avec l'utilisation de Docker sous Windows.

Si vous parvenez à la fenêtre de configuration de VirtualBox, vous pouvez apporter les modifications décrites ci-dessous. Il existe également un client en ligne de commande qui modifiera les ordinateurs virtuels, mais je ne le connais pas bien.

Pour le mode bridged (et c’est vraiment le choix le plus simple), arrêtez votre machine virtuelle, cliquez sur le bouton "Paramètres" en haut, modifiez le mode réseau sur bridged, puis redémarrez la VM. aller. La VM doit saisir une adresse IP sur votre réseau local via DHCP et doit être visible pour les autres ordinateurs du réseau possédant cette adresse IP.

66
Kryten
  1. Ouvrez Oracle VM VirtualBox Manager
  2. Sélectionnez le VM utilisé par Docker
  3. Cliquez sur Paramètres -> Réseau
  4. La carte 1 doit (par défaut?) Être "Attachée à: NAT"
  5. Cliquez sur Avancé -> Transfert de port
  6. Ajouter une règle: Protocole TCP, Port hôte 8080, Port invité 8080 (laissez l'hôte IP et l'invité vide)
  7. Guest est votre conteneur de docker et Host est votre machine

Vous devriez maintenant pouvoir accéder à votre conteneur via localhost: 8080 et your-internal-ip: 8080.

95
Davey Chu

Après avoir essayé plusieurs choses, cela a fonctionné pour moi:

  • utilisez le --publish = 0.0.0.0: 8080: 8080 indicateur de menu fixe
  • définir le mode réseau de virtualbox sur NAT et ne pas utiliser de transfert de port

Avec des adresses autres que 0.0.0.0 je n'ai pas réussi.

3
mnieber

TLDR: Si le pare-feu Windows est activé, assurez-vous qu'il existe une exception pour "vpnkit" sur les réseaux privés.

Dans mon cas particulier, j’ai découvert que le Pare-feu Windows bloquait ma connexion lorsque j’essayais de visiter le port publié de mon conteneur depuis un autre ordinateur de mon réseau local, car sa désactivation permettait à tout de fonctionner.

Cependant, je ne voulais pas désactiver complètement le pare-feu pour pouvoir accéder au service de mon conteneur. Cela posait la question de savoir quelle "application" écoutait pour le service de mon conteneur. Après avoir trouvé un autre fil SO qui m'a appris à utiliser netstat -a -b pour découvrir les applications situées derrière les sockets d'écoute de ma machine, j'ai appris qu'il s'agissait de vpnkit.exe, qui contenait déjà une entrée dans mes paramètres de pare-feu Windows: "réseaux privés" était désactivé dessus, et une fois activé, je pouvais visiter le service de mon conteneur depuis une autre machine sans avoir à désactiver complètement le pare-feu.

1
Atul Varma

Il s’agit du problème le plus courant rencontré par les utilisateurs Windows lors de l’exécution de conteneurs Docker. IMO c'est la "question à un million de dollars sur Docker"; @ "Rocco Smit" a indiqué à juste titre que "le trafic entrant était désactivé par défaut sur le pare-feu de mon ordinateur hôte"; dans mon cas, mon logiciel McAfee Anti Virus. J'ai ajouté des ports supplémentaires à autoriser pour le trafic entrant en provenance d'autres ordinateurs sur le même réseau local Wifi dans les paramètres de pare-feu de McAfee; alors c'était magique. Je luttais depuis plus d'une semaine sur Internet, SO, la documentation de Docker, les tutoriels après les tutoriels relatifs à la mise en réseau de Docker et les nombreuses illustrations de "non pris en charge sur Windows" pour "macvlan", "ipvlan", "utilisateur". pont défini "et même ce même fil SO plusieurs fois. J'ai même commencé à naviguer sur Google avec "quiconque utilisant Docker en production?" (Oui, je sais que Linux est plus populaire pour les charges de travail Prod que pour les serveurs Windows) car je n'ai pas pu accéder (depuis mon mobile au même réseau Wi-Fi domestique) à nginx. application déployée dans Docker Container sous Windows. Après tout, à quoi sert-il si vous ne pouvez pas au moins accéder à l'application (déployée sur un conteneur Docker) à partir d'autres ordinateurs/périphériques du même réseau local; En fin de compte, dans mon cas, le problème concernait uniquement un pare-feu bloquant le trafic entrant;

0
banarasi

Je ne peux pas croire que vous ne pouvez pas établir de connexion au conteneur Docker à partir de l'extérieur de la machine hôte. J'utilise Docker depuis plus d'un an et j'ai mis en place des systèmes sous Linux. Cette semaine est la première fois que j'utilise Docker pour Windows et je suis choqué par le fait qu'il est si difficile de créer un socket sur l'hôte.

Existe-t-il une solution à ce problème ou dois-je vraiment exécuter le menu fixe dans une VM disposant d'un adaptateur ponté?

0
muman

J'ai constaté qu'avec la définition des valeurs du port -p, Docker pour Windows utilise vpnkit et que le trafic entrant était désactivé par défaut sur le pare-feu de ma machine hôte. Après avoir activé les règles TCP entrantes pour vpnkit, j'ai pu accéder à mes conteneurs à partir d'autres machines du réseau local.

0
Rocco Smit