Les ports Docker ne sont pas exposés

J'ai mis en place un serveur de nœud simple dans Docker.

Dockerfile

FROM node:latest
RUN apt-get -y update
ADD example.js .
EXPOSE 1337   
CMD node example.js

Exemple.js

var http = require('http');
http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello Worldn'+new Date);
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

Construisez maintenant l'image

$ docker construire -t node_server .

Maintenant, exécutez dans le conteneur

$ docker run - p 1337: 1337-d node_server
$ 5909e87302ab7520884060437e19ef543ffafc568419c04630abffe6ff731f70

Vérifiez que le conteneur est en cours d'exécution et que les ports sont mappés:

$ docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                    NAMES
5909e87302ab        node_server         "/bin/sh -c 'node exa"   7 seconds ago       Up 6 seconds        0.0.0.0:1337->1337/tcp   grave_goldberg

Maintenant, attachons-nous au conteneur et vérifions que le serveur s'exécute à l'intérieur:

$ Docker exec-it 5909e87302ab7520884060437e19ef543ffafc568419c04630abffe6ff731f70/bin / bash

Et dans la ligne de commande du conteneur, tapez:

root@5909e87302ab:/# curl http://localhost:1337
Hello World
Mon Feb 15 2016 16:28:38 GMT+0000 (UTC)

Semble bon droit?

Le problème

Lorsque j'exécute la même commande curl sur l'hôte (ou naviguez avec mon navigateur vers http://localhost:1337 ) Je ne vois rien.

Tout idée pourquoi le mappage de port entre le conteneur et l'hôte ne fonctionne pas?

Choses que j'ai déjà essayées:

  • Fonctionne avec le drapeau --expose 1337
29
demandé sur Assaf Shomer 2016-02-15 19:36:14

2 réponses

Vos ports sont exposés correctement mais votre serveur écoute les connexions sur 127.0.0.1 à l'intérieur de votre conteneur:

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n'+new Date);
}).listen(1337, '127.0.0.1');

, Vous devez exécuter votre serveur comme ceci:

http.createServer(function (req, res) {
  res.writeHead(200, {'Content-Type': 'text/plain'});
  res.end('Hello World\n'+new Date);
}).listen(1337, '0.0.0.0');

Notez la 0.0.0.0 au lieu de 127.0.0.1.

44
répondu Chris McKinnel 2016-02-15 17:25:44

Ajout D'exposer 1337 au fichier docker

EXPOSE est obligatoire si vous voulez "exposer" ce port vers d'autres conteneurs.

, Comme BMitch commentaires:

Expose n'est pas nécessaire pour publier un port ou pour connecter un conteneur à un conteneur via un réseau Docker partagé.
Ce sont des métadonnées pour publier tous les ports avec -P et inspecter l'image / le conteneur.

Donc:

Fonctionnement avec le drapeau --expose 1337

Pas exactement: vous devez Docker exécuter IT avec -p 1337:1337

Vous avez besoin soit:

  • construisez une image avec la directive EXPOSE (utilisée par -P)
  • ou exécutez-le avec le port publié sur l'hôte -p 1337:1337

Le test curl http://localhost:1337 a été effectué à partir du conteneur (pas de EXPOSE ou de publication nécessaire).
Si vous voulez qu'il fonctionne à partir de l'hôte Linux, vous avez besoin EXPOSE+-P ou vous avez besoin -p 1337:1337.
Soit.

Déclarer exposer seul est bon pour documenter l'intention, mais ne fait rien seul.

Par exemple:

/images / content / 35414479 / 0d72ae2daacfe4fc3a8231cd1493f43b. png

Dans cette figure, 8080 est exposé, publié sur l'hôte Linux 8888.
Et si cet hôte Linux N'est pas l'hôte réel, ce même port doit être fastfowarded à l'hôte réel. Voir " comment accéder à tomcat en cours d'exécution dans le conteneur Docker à partir du navigateur?".

Si localhost ne le fait pas travailler à partir de L'hôte Linux, essayez son adresse IP:

CID=$(docker run -p 1337:1337 -d node_server)
CIP=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' ${CID})
curl http://${CIP}:1337

Ou, comme mentionné ci-dessus, faites écouter votre serveur à partir de connexions provenant de N'importe quelle adresse IP: 0.0.0.0 qui est l'adresse de diffusion ou zéro réseau.

17
répondu VonC 2018-03-22 21:56:40