Configuré un servidor Node simple en Docker.
Dockerfile
FROM node:latest
RUN apt-get -y update
ADD example.js .
EXPOSE 1337
CMD node example.js
ejemplo.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/');
Ahora construye la imagen
$ docker build -t node_server .
Ahora ejecutar en contenedor
$ docker run -p 1337:1337 -d node_server
$ 5909e87302ab7520884060437e19ef543ffafc568419c04630abffe6ff731f70
Compruebe que el contenedor se está ejecutando y que los puertos están asignados:
$ 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
Ahora vamos a adjuntar al contenedor y verificar que el servidor se está ejecutando dentro:
$ docker exec -it 5909e87302ab7520884060437e19ef543ffafc568419c04630abffe6ff731f70 /bin/bash
Y en el tipo de línea de comandos del contenedor:
[email protected]:/# curl http://localhost:1337
Hello World
Mon Feb 15 2016 16:28:38 GMT+0000 (UTC)
Se ve bien, ¿verdad?
El problema
Cuando ejecuto el mismo comando curl en el host (o navego con mi navegador para http://localhost:1337) no veo nada.
¿Alguna idea de por qué la asignación de puertos entre el contenedor y el host no funciona?
Cosas que ya probé:
- Correr con la bandera
--expose 1337
Solución
Los puertos se exponen correctamente, pero el servidor escucha las conexiones dentro del contenedor:127.0.0.1
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello Worldn'+new Date);
}).listen(1337, '127.0.0.1');
Debe ejecutar su servidor de esta manera:
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello Worldn'+new Date);
}).listen(1337, '0.0.0.0');
Tenga en cuenta el 0.0.0.0 en lugar de 127.0.0.1.