Diferencia entre Expose y Ports en Docker

Isaac Tony 30 enero 2023
  1. la instrucción EXPOSE DockerFile en Docker
  2. los puertos de composición de Docker
Diferencia entre Expose y Ports en Docker

En Docker, después de crear un contenedor usando docker create o docker run, es posible que deseemos que nuestro contenedor interactúe con servicios externos u otros contenedores externos. Necesitamos hacer que los puertos estén disponibles para el mundo exterior para lograr esto.

En este artículo, presentaremos dos formas significativas que podemos usar para exponer puertos en Docker. También discutiremos cómo podemos mapear el puerto del contenedor a un puerto host y las diferencias en los métodos.

la instrucción EXPOSE DockerFile en Docker

Un archivo docker es simplemente un archivo de texto que especifica instrucciones para ensamblar una imagen usando el comando docker build. Entre estos se encuentra la instrucción EXPOSE.

La instrucción EXPOSE se usa para informar a Docker que el contenedor que estamos construyendo debe escuchar en un puerto de red particular en tiempo de ejecución. Sin embargo, tenga en cuenta que esta instrucción es simplemente un punto de referencia y no asigna el puerto del contenedor al puerto del host.

Sintaxis:

EXPOSE <port>/<protocol>

No tenemos que especificar el protocolo ya que Docker puede usar el protocolo TCP predeterminado. Sin embargo, podemos proporcionar otros protocolos, como el protocolo UDP.

Docker utilizará el protocolo TCP predeterminado, ya que el protocolo no se especifica en el archivo docker oficial de Nginx.

COPY docker-entrypoint.sh /
COPY 10-listen-on-ipv6-by-default.sh /docker-entrypoint.d
COPY 20-envsubst-on-templates.sh /docker-entrypoint.d
COPY 30-tune-worker-processes.sh /docker-entrypoint.d
ENTRYPOINT ["/docker-entrypoint.sh"]
EXPOSE 80
STOPSIGNAL SIGQUIT
CMD ["nginx", "-g", "daemon off;"]

Supongamos que extraemos la imagen oficial de Nginx del registro de Docker, creamos un contenedor y lo ejecutamos. En ese caso, podemos determinar rápidamente alguna información útil del contenedor, como el número de puerto y el protocolo utilizado.

~/isaac$ docker ps -a

Producción :

CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS     NAMES
99edfdea0443   nginx     "/docker-entrypoint.…"   3 minutes ago   Up 2 minutes   80/tcp    nice_volhard

El resultado anterior muestra que el contenedor Nginx se ejecuta en el puerto 80 como se indica en el Dockerfile y el protocolo TCP.

Alternativamente, también podemos exponer un puerto en tiempo de ejecución usando la etiqueta --expose al crear el contenedor, como se muestra a continuación.

docker run --expose 80 nginx

Ahora, vincule este puerto al número de puerto del host. Necesitamos usar la etiqueta -P mayúscula o la etiqueta -p minúscula.

Aunque podemos lograr los resultados con cualquiera de las dos, estas etiquetas tienen diferencias significativas.

La etiqueta -P en mayúsculas, cuando se usa en tiempo de ejecución, nos permite vincular todas las etiquetas expuestas a puertos aleatorios en el host. Esto nos permite evitar conflictos en los puertos.

$ docker run -d -P nginx
006b88a06e51eac45895f13b33a89221676029e8fa654aaaccc79b81f74efb4d

Código:

isaac$ docker ps -a
CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS         PORTS                   NAMES
006b88a06e51   nginx     "/docker-entrypoint.…"   27 seconds ago   Up 6 seconds   0.0.0.0:49153->80/tcp   angry_babbage

También podemos publicar un contenedor en un puerto específico en el host usando la etiqueta -p en minúsculas.

los puertos de composición de Docker

Docker-compose es una herramienta de utilidad que nos permite ejecutar aplicaciones de varios contenedores en Docker.

En el archivo docker-compose.yml, podemos especificar cómo se configuran nuestros contenedores entre otros archivos, como los servicios, la versión del archivo, los volúmenes utilizados y las redes que conectan los servicios.

Al igual que especificamos los números de puerto en el Dockerfile, también debemos especificar los números de puerto en el archivo docker-compose.yml. Podemos hacer esto usando la instrucción expose o ports.

rabbitmq:
   image: rabbitmq
   expose: 
        - 3000
        - 5000

La instrucción expose nos permite exponer puertos sin publicarlos ni vincularlos a los puertos host, es decir, los puertos no se exponen a las máquinas host, solo se exponen a otros servicios.

Por otro lado, la instrucción ports nos permite especificar los números de puerto del host y del contenedor. Además, estos puertos se compartirán entre otros servicios y se expondrán a la máquina host a un puerto aleatorio o dado.

rabbitmq:
   image: rabbitmq
   ports: 
        - "8000:80"
        - "5000: 70"
Autor: Isaac Tony
Isaac Tony avatar Isaac Tony avatar

Isaac Tony is a professional software developer and technical writer fascinated by Tech and productivity. He helps large technical organizations communicate their message clearly through writing.

LinkedIn