run que puertos mapeo hub exposicion detener desde crear contenedores contenedor como cero networking docker port

networking - que - Los puertos Docker no están expuestos



puertos en docker (2)

Agregar EXPOSE 1337 al archivo docker

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

Corriendo con la bandera --expose 1337

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

Necesitas ambos:

  • construir una imagen con la directiva EXPOSE en ella
  • y ejecutarlo con el puerto publicado en el host -p 1337: 1337

El curl http://localhost:1337 prueba curl http://localhost:1337 se realizó desde el contenedor (no EXPOSE ni se necesita publicar).
Si desea que funcione desde el host de Linux, necesita EXPOSE y necesita -p 1337:1337 .
Ambos.

Solo puede publicar un puerto que haya sido declarado como expuesto.
Declarar que exponer solo no es suficiente.

Por ejemplo:

En esa figura, 8080 está EXPOSE''d, publicado en el host de Linux 8888.
Y si ese host de Linux no es el host real, ese mismo puerto necesita ser acelerado al host real. Consulte " ¿Cómo acceder a tomcat corriendo en el contenedor acoplable desde el navegador? ".

Si localhost no funciona desde el host de Linux, intente con 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 desde conexiones provenientes de cualquier IP: 0.0.0.0 que es la dirección de difusión o red cero .

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 crea la imagen

$ docker build -t node_server.

Ahora ejecuta en contenedor

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

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

$ 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 adjuntarnos al contenedor y verificar que el servidor se ejecuta dentro:

$ docker exec -it 5909e87302ab7520884060437e19ef543ffafc568419c04630abffe6ff731f70 / bin / bash

Y en el tipo de línea de comando del contenedor:

root@5909e87302ab:/# 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 a 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é:

  • Corriendo con la bandera --expose 1337

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 0.0.0.0 en lugar de 127.0.0.1.