Estoy experimentando con Dockerfiles, y creo que entiendo la mayor parte de la lógica. Sin embargo, no veo la diferencia entre "exponer" y "publicar" un puerto en este contexto.
Todos los tutoriales que he visto primero incluyen el EXPOSEcomando en el Dockerfile:
...
EXPOSE 8080
...
Luego construyen una imagen de este Dockerfile:
$ docker build -t an_image - < Dockerfile
Y luego publique el mismo puerto que el anterior cuando ejecute la imagen:
$ docker run -d -p 8080 an_image
o publicar todos los puertos usando
$ docker run -d -P an_image
¿Cuál es el punto de exponer un puerto en el Dockerfile, si se publicará de todos modos? ¿Alguna vez será necesario exponer un puerto primero y no publicarlo más tarde? Efectivamente, me gustaría especificar todos los puertos que usaré en el Dockerfile al crear la imagen, y luego no molestarme con ellos nuevamente, ejecutándolos simplemente con:
$ docker run -d an_image
es posible?

EXPOSEy-pno los de los tres puntos de la bala precedentes de. Me confundí un poco allí.EXPOSE, pero sí especificó-p. Tengo entendido que si siempre usa-py ejecuta contenedores individuales,EXPOSEestá bien omitirlos, pero se vuelve útil / necesario cuando se usa-Po--link. (Y como no sabe cómo otras personas usarán su imagen,EXPOSEdebe especificarse en cualquier imagen pública).Respuesta corta:
EXPOSEes una forma de documentar--publish(o-p) es una forma de asignar un puerto host a un puerto contenedor en ejecuciónObserve a continuación que:
EXPOSEestá relacionado conDockerfiles( documentación )--publishestá relacionado condocker run ...( ejecución / tiempo de ejecución )También,
Acceso al servicio cuando
EXPOSE/--publishno están definidos:En la respuesta de @Golo Roden se afirma que ::
Tal vez ese era el caso en el momento en que se estaba escribiendo la respuesta, pero ahora parece que incluso si no usa
EXPOSEo--publish, elhosty otroscontainersred de la misma podrá acceder a un servicio que puede iniciar dentro de ese contenedor.Cómo probar esto:
He usado lo siguiente
Dockerfile. Básicamente, comienzo con ubuntu e instalo un pequeño servidor web:I
buildla imagen como "testexpose" yrunun nuevo contenedor con:Dentro del contenedor, lanzo algunas instancias de
mini-httpd:Entonces puedo usar
curldesde el host u otros contenedores para buscar la página de inicio demini-httpd.fuente
172.17.0.2) y todos los puertos que estoy mencionando. Si está utilizando Docker para Mac / Windows, la red es diferente. No haydocker0puenteConsulte la referencia de documentación oficial: https://docs.docker.com/engine/reference/builder/#expose
Le
EXPOSEpermiten definir puertos privados (contenedor) y públicos (host) para exponer en el momento de creación de la imagen para cuando el contenedor se está ejecutando si ejecuta el contenedor con-P.El puerto público y el protocolo son opcionales, si no se especifica un puerto público, Docker seleccionará un puerto aleatorio en el host para exponer el puerto contenedor especificado en Dockerfile.
Una buena práctica es no especificar el puerto público, ya que limita solo un contenedor por host (un segundo contenedor arrojará un puerto ya en uso).
Se puede utilizar
-pendocker runcontrolar lo público portuario los puertos de contenedores expuestos serán conectable.De todos modos, si no usa
EXPOSE(con-PDocker Run) ni-p, no se expondrán puertos.Si utiliza siempre
-pendocker runque no es necesarioEXPOSEpero si se utilizaEXPOSEeldocker runcomando puede ser más simple,EXPOSEpuede ser útil si no le importa qué puerto se expone en el host, o si está seguro de un solo contenedor se cargará.fuente
Expone los puertos utilizando la palabra clave EXPOSE en el Dockerfile o el indicador --expose para ejecutar Docker. Exponer puertos es una forma de documentar qué puertos se utilizan, pero en realidad no asigna ni abre ningún puerto. La exposición de los puertos es opcional.
Fuente: github commit
fuente
La mayoría de las personas usan docker componer con redes. La documentación dice:
Lo que significa que si usa redes para la comunicación entre contenedores, no necesita preocuparse por exponer los puertos.
fuente
EXPOSE se utiliza para asignar el puerto del contenedor del puerto local, es decir: si especifica exponer en el archivo acoplable como
EXPOSE 8090Lo que hará será asignar el puerto localhost 8090 al puerto de contenedor 8090
fuente