Docker EXPOSE vs línea de command -p opción (boot2docker)

Después de pasar demasiado time tratando de acceder a mi server de nodo ejecutando desde un contenedor acoplable dentro de una instancia de boot2docker, me di count de que el problema se networkingucía a una diferencia entre exponer y ejecutar ppp -p.

En mi file Docker, EXPOSE 3001, y no pude acceder a esto a través de mi máquina host.

Después de ejecutar "docker run -p 3001: 3001 myappinst myapp", pude acceder al puerto.

Hasta ahora, pensaba que "docker run -p 3001: 3001" era esencialmente lo mismo que EXPOSE 3001 en el file docker.

Me di count, sin embargo, cuando ejecutaba docker ps

Obtengo lo siguiente para "EXPOSE":

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 16341e2b9968 housemation-crawler:latest "npm start" 2 minutes ago Up 2 minutes 3001/tcp housemation-crawler-inst

(nota: 3001 / tcp)

vs the below con docker run -p 3001:3001

CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 0b14f736033c housemation-crawler:latest "npm start" 8 seconds ago Up 2 seconds 0.0.0.0:3001->3001/tcp housemation-crawler-inst

(0.0.0.0:3001->3001/tcp)

Parece que este último está haciendo algún tipo de reenvío de puertos, mientras que el primero solo está abriendo el puerto. ¿Sería eso correcto?

Si quisiera acceder a un puerto expuesto no reenviado, ¿cómo lo haré? Además, si quería tener el reenvío de puertos dentro del file docker, ¿cuál sería la syntax correcta?

Sus suposiciones acerca de cómo EXPOSE en Dockerfile y la opción -p en la docker run Dockerfile son correctas. Como puede leer en la documentation de Docker on line :

EXPOSE <port> [<port>...]

Las instrucciones EXPOSE informan a Docker que el contenedor escuchará en los puertos de networking especificados en time de ejecución. Docker utiliza esta información para interconectar contenedores mediante enlaces (consulte la Guía del usuario de Docker) y para determinar qué puertos mostrar al host cuando usa el indicador -P. Nota: EXPOSE no define qué puertos pueden exponerse al host o hacer que los puertos sean accesibles desde el host de manera pnetworkingeterminada. Para exponer los puertos al host, en time de ejecución, use el indicador -p o el indicador -P.

Entonces, la instrucción EXPOSE en Dockerfile indicará Docker qué puertos deben mapear al host si ejecuta el contenedor con el indicador -P ; pero los puertos locales asignados no son deterministas y Docker los elige en el time de ejecución. Aparte de esto, Docker utilizará los puertos en EXPOSE para exportar información como variables de entorno en contenedores vinculados.

Si desea establecer el puerto local asignado, debe usar la opción -p en la docker run .