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
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.
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:
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.