¿Cómo inspeccionar los puertos expuestos de un contenedor Docker?

DockerBeginner
Practicar Ahora

Introducción

Docker es una tecnología de containerización ampliamente adoptada que revolucionó la forma en que se desarrollan, empaquetan e implementan las aplicaciones. Comprender los puertos expuestos de un contenedor Docker es un aspecto fundamental al trabajar con Docker, ya que permite acceder e interactuar con los servicios que se ejecutan dentro del contenedor. Este tutorial le guiará a través del proceso de inspección de los puertos expuestos de un contenedor Docker, permitiéndole gestionar y optimizar mejor sus aplicaciones containerizadas.

Comprender los Puertos de los Contenedores Docker

Antes de sumergirnos en la inspección de los puertos de los contenedores, entendamos primero qué son los puertos y por qué son importantes en los contenedores Docker.

¿Qué son los Puertos de los Contenedores?

En Docker, los puertos permiten que los servicios que se ejecutan dentro de un contenedor se comuniquen con el mundo exterior. Piense en los puertos como puertas de entrada a su aplicación containerizada: sin abrir estas puertas, nadie puede acceder a los servicios internos.

Tipos de Configuraciones de Puertos

Docker admite dos tipos principales de configuraciones de puertos:

  1. Puertos Expuestos (Exposed Ports): Puertos que un contenedor pone a disposición para posibles conexiones, pero que no son automáticamente accesibles desde el host.

  2. Puertos Publicados (Published Ports): Puertos expuestos que se mapean a un puerto en el host, lo que permite el acceso externo a los servicios del contenedor.

Ejecutemos un contenedor de servidor web simple para entender esto mejor:

docker run -d --name web-demo nginx

Ejecute este comando en la terminal. Esto inicia un contenedor de servidor web Nginx llamado web-demo en modo desatendido (ejecutándose en segundo plano).

La salida mostrará un ID de contenedor, similar a:

3a6e8df899a9b723de9e4684542dc9987af26381118fa36496757d17ac952c9f

Este contenedor Nginx tiene el puerto 80 expuesto por defecto (como se define en su Dockerfile), pero aún no lo hemos publicado en el host, por lo que no podemos acceder a él desde fuera.

Examinando la Configuración de Puertos del Contenedor

Ahora que tenemos nuestro contenedor en ejecución, examinemos su configuración de puertos.

Usando docker ps para Ver los Mapeos de Puertos

El comando docker ps muestra los contenedores en ejecución y sus configuraciones de puertos.

Ejecute este comando en su terminal:

docker ps

Verá una salida similar a:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
3a6e8df899a9   nginx     "/docker-entrypoint.…"   2 minutes ago    Up 2 minutes    80/tcp    web-demo

Observe la columna PORTS. Muestra 80/tcp, lo que indica que el puerto 80 está expuesto pero no publicado en el host.

Ejecutando un Contenedor con Puertos Publicados

Detengamos nuestro primer contenedor y creemos uno nuevo con un puerto publicado:

docker stop web-demo
docker rm web-demo

Ahora ejecute un nuevo contenedor con mapeo de puertos:

docker run -d --name web-demo -p 8080:80 nginx

La opción -p 8080:80 publica el puerto 80 del contenedor en el puerto 8080 del host.

Ejecute docker ps de nuevo para ver la diferencia:

docker ps

Salida:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
f7d483e51ef2   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 10 seconds   0.0.0.0:8080->80/tcp   web-demo

Observe cómo la columna PORTS ahora muestra 0.0.0.0:8080->80/tcp, lo que indica que el puerto 80 en el contenedor está mapeado al puerto 8080 en todas las interfaces del host.

Inspeccionando los Detalles de los Puertos del Contenedor

Docker proporciona múltiples comandos para inspeccionar las configuraciones de puertos de los contenedores en detalle. Exploremos estas opciones.

Usando el comando docker port

El comando docker port muestra los mapeos de puertos para un contenedor:

docker port web-demo

Salida:

80/tcp -> 0.0.0.0:8080

Esto muestra que el puerto 80/tcp en el contenedor está mapeado al puerto 8080 en todas las interfaces del host.

Usando docker inspect para Información Detallada

Para obtener información más detallada, use el comando docker inspect:

docker inspect web-demo

Este comando produce una gran cantidad de salida JSON con información detallada sobre el contenedor. Para filtrar solo la información del puerto, use este comando:

docker inspect --format='{{json .NetworkSettings.Ports}}' web-demo | jq

Si jq no está instalado, puede instalarlo con:

sudo apt-get update && sudo apt-get install -y jq

La salida del comando inspect filtrado se verá así:

{
  "80/tcp": [
    {
      "HostIp": "0.0.0.0",
      "HostPort": "8080"
    }
  ]
}

Esto muestra información detallada del mapeo de puertos:

  • Puerto del contenedor: 80/tcp
  • IP del host: 0.0.0.0 (todas las interfaces)
  • Puerto del host: 8080

Listando Todos los Puertos del Contenedor

Si tiene múltiples contenedores, puede ver todos los mapeos de puertos con:

docker ps --format "{{.Names}}: {{.Ports}}"

Salida:

web-demo: 0.0.0.0:8080->80/tcp

Esto es útil al administrar múltiples contenedores con diferentes configuraciones de puertos.

Accediendo a los Servicios a Través de los Puertos Expuestos

Ahora que entendemos cómo inspeccionar los puertos del contenedor, accedamos al servidor web que se ejecuta en nuestro contenedor.

Probando la Accesibilidad del Contenedor

Dado que mapeamos el puerto 80 del contenedor al puerto 8080 en el host, podemos acceder al servidor web Nginx a través del puerto 8080.

Usemos el comando curl para hacer una solicitud a nuestro servidor web:

curl localhost:8080

Debería ver el HTML de la página de bienvenida de Nginx:

<!DOCTYPE html>
<html>
  <head>
    <title>Welcome to nginx!</title>
    <style>
      html {
        color-scheme: light dark;
      }
      body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
      }
    </style>
  </head>
  <body>
    <h1>Welcome to nginx!</h1>
    <p>
      If you see this page, the nginx web server is successfully installed and
      working. Further configuration is required.
    </p>

    <p>
      For online documentation and support please refer to
      <a href="http://nginx.org/">nginx.org</a>.<br />
      Commercial support is available at
      <a href="http://nginx.com/">nginx.com</a>.
    </p>

    <p><em>Thank you for using nginx.</em></p>
  </body>
</html>

Esto confirma que podemos acceder al servidor web Nginx que se ejecuta dentro de nuestro contenedor a través del puerto publicado.

Ejecutando Múltiples Servicios

Creemos otro contenedor con un servicio diferente y un mapeo de puertos:

docker run -d --name redis-demo -p 6379:6379 redis

Este comando inicia un contenedor de base de datos Redis y mapea su puerto predeterminado 6379 al mismo puerto en el host.

Verifique los contenedores en ejecución:

docker ps

Salida:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                    NAMES
a45df67e21b3   redis     "docker-entrypoint.s…"   10 seconds ago   Up 10 seconds   0.0.0.0:6379->6379/tcp   redis-demo
f7d483e51ef2   nginx     "/docker-entrypoint.…"   10 minutes ago   Up 10 minutes   0.0.0.0:8080->80/tcp     web-demo

Ahora tenemos dos contenedores ejecutando diferentes servicios, cada uno con su propio mapeo de puertos.

Gestión de las Configuraciones de Puertos del Contenedor

Ahora que entendemos cómo inspeccionar y acceder a los servicios en contenedores, exploremos algunos conceptos adicionales de gestión de puertos.

Escenarios Comunes de Gestión de Puertos

Aquí hay algunos escenarios comunes que podría encontrar:

1. Cambiando los Mapeos de Puertos

Si el puerto 8080 ya está en uso en su host, puede mapear a un puerto diferente:

docker stop web-demo
docker rm web-demo
docker run -d --name web-demo -p 8081:80 nginx

Ahora el contenedor Nginx es accesible en el puerto 8081:

curl localhost:8081

2. Enlazando a Interfaces Específicas

En lugar de enlazar a todas las interfaces (0.0.0.0), puede enlazar a una IP específica:

docker stop web-demo
docker rm web-demo
docker run -d --name web-demo -p 127.0.0.1:8080:80 nginx

Esto enlaza el puerto del contenedor solo a la interfaz de localhost, haciéndolo inaccesible desde fuera del host.

3. Usando Puertos Host Aleatorios

Si no le importa qué puerto host se utiliza, deje que Docker asigne uno:

docker stop web-demo
docker rm web-demo
docker run -d --name web-demo -P nginx

La bandera -P publica todos los puertos expuestos a puertos aleatorios en el host.

Verifique el puerto asignado:

docker port web-demo

Salida:

80/tcp -> 0.0.0.0:49153

El número de puerto exacto variará, pero en este ejemplo, el puerto 80 se mapeó al puerto 49153.

Solución de Problemas Comunes de Puertos

Aquí hay soluciones a problemas comunes relacionados con los puertos:

  1. Puerto ya en Uso: Si ve un error como "el puerto ya está asignado", elija un puerto diferente:
docker run -d --name another-web -p 8082:80 nginx
  1. El Contenedor no Puede Conectarse al Host: Si un contenedor necesita conectarse a un servicio en el host, use el nombre DNS especial de Docker host.docker.internal en lugar de localhost:
docker run --rm alpine ping -c 2 host.docker.internal
  1. Verificando Qué Proceso Usa un Puerto: Si un puerto ya está en uso en el host, encuentre el proceso:
sudo lsof -i :8080

Limpieza

Limpiemos nuestros contenedores:

docker stop web-demo redis-demo
docker rm web-demo redis-demo

Resumen

En este laboratorio, ha aprendido a trabajar con los puertos de los contenedores Docker, incluyendo:

  • Comprender la diferencia entre los puertos expuestos y los puertos publicados
  • Ejecutar contenedores con mapeos de puertos específicos
  • Inspeccionar las configuraciones de puertos de los contenedores utilizando varios comandos de Docker
  • Acceder a los servicios que se ejecutan dentro de los contenedores a través de los puertos mapeados
  • Gestionar y solucionar problemas de escenarios comunes relacionados con los puertos

Estas habilidades son fundamentales para trabajar con contenedores Docker y son esenciales para desplegar aplicaciones en contenedores en entornos de desarrollo y producción. Con este conocimiento, ahora puede configurar y gestionar los aspectos de red de sus contenedores Docker con confianza.