Mapeo de puertos en Docker: host:container

Clase 19 de 34Curso de Docker Avanzado

Resumen

La seguridad por defecto de Docker cierra todos los puertos del contenedor, y eso es una gran noticia. Aquí verás, de forma clara y práctica, cómo mapear puertos, cuándo usar -p o -P en docker run, y cómo comprobar que tus contenedores (por ejemplo con NGINX) exponen el servicio correcto en localhost.

¿Cómo funciona el mapeo de puertos en Docker?

La idea clave: el primer puerto es el de tu computadora y el segundo es el del contenedor. Así, puedes hablar con Docker en un puerto de host y Docker traduce esa comunicación al puerto interno del contenedor.

¿Qué indica host:container al usar -p?

  • Con -p host:container, 8080:80 significa host 8080 hacia contenedor 80.
  • Tú escribes al 8080 del host y Docker lo mapea al 80 interno.
  • Puedes cambiar el puerto del host sin tocar el contenedor.

Ejemplo:

docker run -d -p 8080:80 --name mi-nginx nginx
  • Comprueba en localhost:8080 y verás la página de inicio de NGINX.
  • Si detienes/eliminás el contenedor y relanzas con otro puerto, cambia la URL.
docker run -d -p 8081:80 --name nginx-2 nginx

¿Cómo verificar que el contenedor está corriendo?

  • Usa docker ps para ver id, imagen y estado.
  • Revisa en Docker Desktop la sección Containers.
  • Abre localhost:puerto en el navegador para validar el servicio.

¿Qué diferencias hay entre -p y -P en docker run?

Ambas opciones abren una puerta de entrada desde el host, pero con comportamientos distintos. Con -p eliges el puerto exacto del host; con -P Docker elige por ti un puerto disponible.

-p: puerto fijo y controlado

  • Control total del puerto del host que expones.
  • Si un puerto ya está en uso, no podrás reutilizarlo en otro contenedor al mismo tiempo.
  • Cambiar de 8080 a 8081 implica que 8080 deja de responder para ese contenedor.

Ejemplos:

# 8081 del host hacia 80 del contenedor
docker run -d -p 8081:80 --name nginx-1 nginx

# Otro contenedor usando un puerto distinto del host
docker run -d -p 1524:80 --name nginx-2 nginx

-P: asignación automática de puerto

  • Docker crea por ti un puerto aleatorio en el host y lo mapea al interno.
  • Útil si no quieres decidir manualmente el puerto de host.
  • Puedes ver el puerto elegido con docker port.

Ejemplo:

docker run -d -P --name nginx-3 nginx
# Consultar el mapeo
docker port nginx-3
# Salida típica: 80/tcp -> 0.0.0.0:32768
  • En Docker Desktop, el puerto aparece en Containers y puedes hacer clic para abrirlo.

¿Cómo gestionar varios contenedores sin conflictos de puertos?

Puedes ejecutar múltiples instancias de la misma imagen si cada una expone un puerto diferente en el host. Recuerda: no puedes usar el mismo puerto del host para dos contenedores al mismo tiempo.

¿Cómo correr varias instancias de una misma imagen?

  • Lanza múltiples contenedores con puertos distintos del host.
  • Ejemplos válidos: 8081, 1524, 6223, etc.
  • Accede a cada uno desde localhost:puerto correspondiente.

Ejemplos:

docker run -d -p 8081:80 --name nginx-a nginx
docker run -d -p 1524:80 --name nginx-b nginx
  • Abre en el navegador: localhost:8081 y localhost:1524.
  • Todos sirven la misma imagen, pero por puertos diferentes.

¿Qué herramientas ayudan a visualizar puertos?

  • En Docker Desktop > Containers ves el mapeo host:container de cada contenedor.
  • Desde Images puedes crear nuevas instancias y definir el puerto en “configuraciones opcionales”.
  • Usa docker ps para validar ejecución y docker port nombre para ver mapeos exactos.
  • Mantén un “inventario mental” de puertos ocupados y detén contenedores para liberar puertos cuando no los uses.

¿Tienes un truco para recordar el orden host:container o prefieres -P para olvidarte del puerto? Cuéntalo en los comentarios y comparte tus comandos favoritos.

      Mapeo de puertos en Docker: host:container