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.