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:
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.
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:
- 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
- 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.internalen lugar delocalhost:
docker run --rm alpine ping -c 2 host.docker.internal
- 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.



