Los puertos Docker no están expuestos


Configuré un servidor de nodo 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 World\n'+new Date);
}).listen(1337, '127.0.0.1');
console.log('Server running at http://127.0.0.1:1337/');

Ahora construye la imagen

Doc docker build-t node_server .

Ahora ejecutar en contenedor

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

Verifique que el contenedor se esté ejecutando y que los puertos estén mapeados:

Doc 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 conectar al contenedor y verificar que el servidor se está ejecutando dentro:

Doc docker exec-it 5909e87302ab7520884060437e19ef543ffafc568419c04630abffe6ff731f70/bin / bash

Y en la línea de comandos del contenedor escriba:

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

Se Ve bien?

El problema

Cuando ejecute el mismo comando curl en el host (o navegue con mi navegador a http://localhost:1337 ) No veo nada.

Cualquiera idea ¿por qué el mapeo de puertos entre contenedor y host no funciona?

Cosas que ya probé:

  • Corriendo con la bandera --expose 1337
Author: Assaf Shomer, 2016-02-15

2 answers

Sus puertos están siendo expuestos correctamente pero su servidor está escuchando conexiones en 127.0.0.1 dentro de su contenedor:

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');

Necesita ejecutar su servidor de esta manera:

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');

Tenga en cuenta la 0.0.0.0 en lugar de 127.0.0.1.

 44
Author: Chris McKinnel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-02-15 17:25:44

Añadiendo EXPOSE 1337 al archivo docker

EXPOSE es obligatorio si desea "exponer" ese puerto a otros contenedores.

Como BMitch comenta:

Expose no es necesario para publicar un puerto o para conectar un contenedor a un contenedor a través de una red docker compartida.
Son metadatos para publicar todos los puertos con -P e inspeccionar la imagen/contenedor.

Así que:

Corriendo con la bandera --expose 1337

No exactamente: necesita docker ejecutar con -p 1337:1337

Necesitas:

  • construye una imagen con la directiva EXPOSE en ella (utilizada por -P)
  • o ejecutarlo con el puerto publicado en el host -p 1337:1337

La prueba curl http://localhost:1337 se hizo desde dentro del contenedor (no EXPOSE o publicar necesario).
Si quieres que funcione desde el host Linux, necesitas EXPOSE+-P o necesitas -p 1337:1337.
Bien.

Declarando exponer solo es bueno para documentar la intención, pero no hace nada solo.

Por ejemplo:

/ images / content / 35414479 / 0d72ae2daacfe4fc3a8231cd1493f43b. png

En esa figura, 8080 es EXPOSE'd, publicado en el host Linux 8888.
Y si ese host de Linux no es el host real, ese mismo puerto debe ser entregado rápidamente al host real. Consulte " ¿Cómo acceder a tomcat que se ejecuta en el contenedor docker desde el navegador?".

Si localhost no lo hace trabaja desde el host Linux, prueba su dirección IP:

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

O, como se mencionó anteriormente, haga que su servidor escuche conexiones provenientes de cualquier IP: 0.0.0.0 que es la dirección de difusión o la red cero.

 17
Author: VonC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-03-22 21:56:40