run - docker push image and tag
¿Cuál es la diferencia entre los puertos docker-compose y los de exposición? (5)
Puertos
La sección de
ports
publicará puertos en el host.
Docker configurará un reenvío para un puerto específico desde la red host al contenedor.
De manera predeterminada, esto se implementa con un proceso de proxy de espacio de usuario (
docker-proxy
) que escucha en el primer puerto y reenvía al contenedor, que necesita escuchar en el segundo punto.
Si el contenedor no está escuchando en el puerto de destino, aún verá algo escuchando en el host, pero se le negará una conexión si intenta conectarse a ese puerto host, desde el error hacia adelante en su contenedor.
Tenga en cuenta que el contenedor debe estar escuchando en todas las interfaces de red ya que este proxy no se ejecuta dentro del espacio de nombres de red del contenedor y no puede alcanzar 127.0.0.1 dentro del contenedor.
El método IPv4 para eso es configurar su aplicación para escuchar en
0.0.0.0
.
También tenga en cuenta que los puertos publicados no funcionan en la dirección opuesta. No puede conectarse a un servicio en el host desde el contenedor publicando un puerto. En su lugar, encontrará errores de Docker que intentan escuchar el puerto host ya en uso.
Exponer
Exponer es documentación.
Establece metadatos en la imagen y, cuando se ejecuta, también en el contenedor.
Por lo general, configura esto en el Dockerfile con la instrucción
EXPOSE
, y sirve como documentación para los usuarios que ejecutan su imagen, para que sepan en qué puertos escuchará su aplicación de manera predeterminada.
Cuando se configura con un archivo de composición, estos metadatos solo se establecen en el contenedor.
Puede ver los puertos expuestos cuando ejecuta una
docker inspect
en la imagen o contenedor.
Hay algunas herramientas que dependen de puertos expuestos.
En Docker, el indicador
-P
publicará todos los puertos expuestos en puertos efímeros en el host.
También hay varios proxys inversos que usarán de manera predeterminada un puerto expuesto al enviar tráfico a su aplicación si no configura explícitamente el puerto del contenedor.
Aparte de esas herramientas externas, la exposición no tiene ningún impacto en la red entre contenedores.
Solo necesita una red de acopladores común y conectarse al puerto del contenedor para acceder a un contenedor desde otro.
Si esa red es creada por el usuario (por ejemplo, no la red de puente predeterminada llamada
bridge
), puede usar DNS para conectarse a los otros contenedores.
¿Cuál es la diferencia entre los
ports
y las opciones de
expose
en
docker-compose.yml
De acuerdo con la referencia docker-compose ,
Ports se define como:
Exponer puertos . Especifique ambos puertos (HOST: CONTAINER) o solo el puerto del contenedor (se elegirá un puerto de host aleatorio).
- Los puertos mencionados en docker-compose.yml se compartirán entre los diferentes servicios iniciados por docker-compose.
- Los puertos estarán expuestos a la máquina host a un puerto aleatorio o un puerto determinado.
Mi
docker-compose.yml
ve así:
mysql:
image: mysql:5.7
ports:
- "3306"
Si hago
docker-compose ps
, se verá así:
Name Command State Ports
-------------------------------------------------------------------------------------
mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:32769->3306/tcp
Expose se define como:
Exponga los puertos sin publicarlos en la máquina host: solo serán accesibles para los servicios vinculados. Solo se puede especificar el puerto interno.
Los puertos no están expuestos a máquinas host, solo están expuestos a otros servicios.
mysql:
image: mysql:5.7
expose:
- "3306"
Si hago
docker-compose ps
, se verá así:
Name Command State Ports
---------------------------------------------------------------
mysql_1 docker-entrypoint.sh mysqld Up 3306/tcp
Estoy totalmente de acuerdo con las respuestas anteriores. Solo quiero mencionar que la diferencia entre exposición y puertos es parte del concepto de seguridad en Docker. Va de la mano con la networking de Docker. Por ejemplo:
Imagine una aplicación con un front-end web y un back-end de base de datos. El mundo exterior necesita acceso al front-end web (quizás en el puerto 80), pero solo el back-end necesita acceso al host y al puerto de la base de datos. Al usar un puente definido por el usuario, solo se necesita abrir el puerto web, y la aplicación de la base de datos no necesita ningún puerto abierto, ya que el front-end web puede alcanzarlo a través del puente definido por el usuario.
Este es un caso de uso común cuando se configura una arquitectura de red en Docker. Entonces, por ejemplo, en una red puente predeterminada, no se puede acceder a los puertos desde el mundo exterior. Por lo tanto, puede abrir un punto de entrada con "puertos". Con el uso de "exponer" usted define la comunicación dentro de la red. Si desea exponer los puertos predeterminados, no necesita definir "exponer" en su archivo docker-compose.
Puertos Esta sección se utiliza para definir la asignación entre el servidor host y el contenedor Docker.
ports:
- 10005:80
Significa que la aplicación que se ejecuta dentro del contenedor está expuesta en el puerto 80. Pero el sistema / entidad externa no puede acceder a ella, por lo que debe asignarse al puerto del servidor host.
Nota: debe abrir el puerto host 10005 y modificar las reglas del firewall para permitir que entidades externas accedan a la aplicación.
Pueden usar
http: // {host IP}: 10005
algo como esto
EXPOSE Esto se usa exclusivamente para definir el puerto en el que se ejecuta la aplicación dentro del contenedor docker.
También puede definirlo en dockerfile. En general, es una práctica buena y ampliamente utilizada definir EXPOSE dentro del dockerfile porque muy raramente alguien los ejecuta en otro puerto que no sea el puerto predeterminado 80
puertos :
- Activa el contenedor para escuchar los puertos especificados del mundo fuera de la ventana acoplable (puede ser la misma máquina host o una máquina diferente) Y también un mundo accesible dentro de la ventana acoplable.
- Se puede especificar más de un puerto (es por eso que los puertos no son portuarios)
exponer :
- Activa el contenedor para escuchar un puerto específico solo desde el mundo dentro de la ventana acoplable Y el mundo no accesible fuera de la ventana acoplable.
- Se puede especificar más de un puerto