Cómo usar el comando docker compose port para encontrar puertos mapeados

DockerDockerBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderás a utilizar el comando docker port para descubrir el puerto público asignado a un servicio de Docker. Comenzaremos creando un servicio simple con mapeo de puertos utilizando la imagen nginx.

Después de crear el servicio, explorarás cómo encontrar el puerto público para todo el servicio, para un protocolo específico y para un índice particular de contenedor dentro del servicio. Esta experiencia práctica te proporcionará las habilidades para identificar programáticamente los puertos expuestos de tus contenedores Docker.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/ps("List Running Containers") docker/ContainerOperationsGroup -.-> docker/port("List Container Ports") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/ImageOperationsGroup -.-> docker/images("List Images") subgraph Lab Skills docker/run -.-> lab-555085{{"Cómo usar el comando docker compose port para encontrar puertos mapeados"}} docker/ps -.-> lab-555085{{"Cómo usar el comando docker compose port para encontrar puertos mapeados"}} docker/port -.-> lab-555085{{"Cómo usar el comando docker compose port para encontrar puertos mapeados"}} docker/pull -.-> lab-555085{{"Cómo usar el comando docker compose port para encontrar puertos mapeados"}} docker/images -.-> lab-555085{{"Cómo usar el comando docker compose port para encontrar puertos mapeados"}} end

Crear un servicio simple con mapeo de puertos

En este paso, aprenderemos cómo crear un servicio simple usando Docker y mapear un puerto del contenedor a la máquina host. Esto permite el acceso externo al servicio que se ejecuta dentro del contenedor.

Primero, descarguemos la imagen nginx de Docker Hub. Esta imagen contiene un servidor web ligero que podemos usar para nuestro ejemplo.

docker pull nginx

Deberías ver una salida que indica que la imagen se está descargando. Una vez que se complete la descarga, puedes verificar que la imagen está disponible localmente listando las imágenes:

docker images

Ahora, ejecutemos un contenedor basado en la imagen nginx y mapeemos el puerto 80 del contenedor al puerto 8080 en la máquina host. La bandera -d ejecuta el contenedor en modo desacoplado (en segundo plano), y la bandera -p 8080:80 realiza el mapeo de puertos.

docker run -d -p 8080:80 nginx

Este comando inicia un servidor web Nginx dentro de un contenedor Docker y lo hace accesible en el puerto 8080 de tu VM LabEx.

Para verificar que el contenedor está en ejecución y que el mapeo de puertos funciona, puedes usar el comando docker ps para listar los contenedores en ejecución. Busca el contenedor que ejecuta la imagen nginx y revisa la columna PORTS. Deberías ver 0.0.0.0:8080->80/tcp.

docker ps

Finalmente, puedes acceder a la página de bienvenida de Nginx usando curl para hacer una solicitud a localhost en el puerto 8080.

curl localhost:8080

Deberías ver el contenido HTML de la página de bienvenida predeterminada de Nginx en la salida. Esto confirma que el contenedor está en ejecución y accesible a través del puerto mapeado.

Encontrar el puerto público del servicio

En el paso anterior, creamos un contenedor Docker y mapeamos un puerto del contenedor al host. Ahora, aprendamos cómo encontrar programáticamente el puerto público en el que se expone un servicio. Esto es útil cuando no recuerdas explícitamente qué puerto del host mapeaste al puerto interno del contenedor.

El comando docker port está diseñado específicamente para este propósito. Muestra los mapeos de puertos para un contenedor dado. Debes proporcionar el ID o nombre del contenedor como argumento.

Primero, obtengamos el ID del contenedor del contenedor Nginx en ejecución. Puedes usar docker ps y filtrar la salida, o simplemente copiar el ID de la salida del comando docker ps del paso anterior.

docker ps

Busca el contenedor que ejecuta la imagen nginx y anota su Container ID.

Ahora, usa el comando docker port seguido del Container ID para ver los mapeos de puertos.

docker port [CONTAINER_ID]

Reemplaza [CONTAINER_ID] con el ID real de tu contenedor Nginx.

La salida mostrará el puerto interno del contenedor y el puerto del host correspondiente al que está mapeado. Por ejemplo, deberías ver algo como 80/tcp -> 0.0.0.0:8080. Esto indica que el puerto interno 80 del contenedor (usando protocolo TCP) está mapeado al puerto 8080 en todas las interfaces del host (0.0.0.0).

Este comando es una forma rápida de determinar el puerto público sin tener que inspeccionar la configuración completa del contenedor.

Encontrar el puerto público para un protocolo específico

En el paso anterior, usamos docker port para encontrar todos los mapeos de puertos de un contenedor. A veces, un contenedor puede exponer múltiples puertos usando diferentes protocolos (como TCP y UDP). En este paso, aprenderemos cómo encontrar el puerto público para un protocolo específico.

El comando docker port te permite especificar el puerto interno del contenedor y el protocolo que te interesa. El formato es docker port [CONTAINER_ID] [CONTAINER_PORT]/[PROTOCOL].

Busquemos el puerto público para el puerto interno 80 del contenedor Nginx usando el protocolo TCP. Primero, asegúrate de tener el Container ID del paso anterior. Si no lo tienes, puedes obtenerlo nuevamente con docker ps.

docker ps

Ahora, usa el comando docker port con el ID del contenedor y el puerto y protocolo específicos:

docker port [CONTAINER_ID] 80/tcp

Reemplaza [CONTAINER_ID] con el ID real de tu contenedor Nginx.

La salida debería mostrar directamente el puerto del host mapeado al puerto interno 80 del contenedor para el protocolo TCP, que sería 0.0.0.0:8080. Esto es más específico que simplemente ejecutar docker port [CONTAINER_ID], que listaría todos los mapeos.

Esta funcionalidad es particularmente útil cuando un contenedor expone el mismo número de puerto para diferentes protocolos, y solo necesitas el mapeo para uno de ellos.

Encontrar el puerto público para un índice específico de contenedor

En escenarios avanzados, un contenedor podría exponer el mismo puerto interno múltiples veces, potencialmente mapeado a diferentes puertos o interfaces del host. Aunque es menos común para servicios simples como Nginx, es posible. En estos casos, el comando docker port puede devolver múltiples mapeos para un solo puerto interno.

Para recuperar un mapeo específico cuando existen varios, puedes usar un índice. La salida de docker port para un puerto interno dado es una lista de mapeos. Puedes acceder a un mapeo específico mediante su índice, comenzando desde 0.

Supongamos, a modo de demostración, que nuestro contenedor Nginx tuviera múltiples mapeos para el puerto 80. Para obtener el primer mapeo (índice 0), usarías el siguiente formato de comando:

docker port [CONTAINER_ID] [CONTAINER_PORT]/[PROTOCOL]/[INDEX]

Usando nuestro ejemplo de Nginx, para obtener el primer mapeo del puerto interno 80 TCP, usarías:

docker port [CONTAINER_ID] 80/tcp/0

Reemplaza [CONTAINER_ID] con el ID real de tu contenedor Nginx.

Como nuestro contenedor Nginx solo tiene un mapeo para el puerto 80/tcp, este comando devolverá el mismo resultado que docker port [CONTAINER_ID] 80/tcp, que sería 0.0.0.0:8080.

Aunque este ejemplo específico con Nginx podría no mostrar todo el potencial del uso de índices (ya que solo hay un mapeo), entender esta capacidad es importante para configuraciones de contenedores más complejas donde podrían existir múltiples mapeos para el mismo puerto interno.

Resumen

En este laboratorio, aprendimos cómo crear un servicio Docker básico con mapeo de puertos mediante la descarga de una imagen Nginx, la ejecución de un contenedor y el mapeo del puerto 80 del contenedor al puerto 8080 del host. Verificamos el estado del contenedor y el mapeo de puertos usando docker ps y confirmamos la accesibilidad haciendo curl al puerto mapeado del host.

Posteriormente, exploramos cómo encontrar programáticamente el puerto público para un servicio usando el comando docker port, lo cual es particularmente útil cuando no se conoce explícitamente el mapeo de puertos del host. Este comando nos permite recuperar el puerto del host que corresponde a un puerto interno del contenedor.