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 EXPOSE
comando 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?
EXPOSE
y-p
no 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-p
y ejecuta contenedores individuales,EXPOSE
está bien omitirlos, pero se vuelve útil / necesario cuando se usa-P
o--link
. (Y como no sabe cómo otras personas usarán su imagen,EXPOSE
debe especificarse en cualquier imagen pública).Respuesta corta:
EXPOSE
es 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:
EXPOSE
está relacionado conDockerfiles
( documentación )--publish
está relacionado condocker run ...
( ejecución / tiempo de ejecución )También,
Acceso al servicio cuando
EXPOSE
/--publish
no 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
EXPOSE
o--publish
, elhost
y otroscontainers
red 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
build
la imagen como "testexpose" yrun
un nuevo contenedor con:Dentro del contenedor, lanzo algunas instancias de
mini-httpd
:Entonces puedo usar
curl
desde 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 haydocker0
puenteConsulte la referencia de documentación oficial: https://docs.docker.com/engine/reference/builder/#expose
Le
EXPOSE
permiten 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
-p
endocker run
controlar lo público portuario los puertos de contenedores expuestos serán conectable.De todos modos, si no usa
EXPOSE
(con-P
Docker Run) ni-p
, no se expondrán puertos.Si utiliza siempre
-p
endocker run
que no es necesarioEXPOSE
pero si se utilizaEXPOSE
eldocker run
comando puede ser más simple,EXPOSE
puede 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 8090
Lo que hará será asignar el puerto localhost 8090 al puerto de contenedor 8090
fuente