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 contenedordocker run -d -p 8081:80 --name nginx-1 nginx
# Otro contenedor usando un puerto distinto del hostdocker 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 mapeodocker 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.
El 1er Puerto de my parametro -P es aquel cual my computadora se comunica a dockerDaemon ;
El 2nd Puerto de my parametro es con Docker se Comunica a su contenedor;
Esto suele causarme confusion binaria por no saber cual es cual y luego tengo que adivinar a try and fail para ver cual sera el correcto de my localHost .
Una pregunta, es una buena practica usar los mismos puertos por ejemplo 5000:5000? o el segundo puerto debe ser diferente?
Otro dato curioso es que hay que evitar usar puertos reservados que van del 0 al 1023
No hay problema en usar el mismo puerto, después de que estén disponibles lo puedes hacer
¿si tu publicas tu docker de nginx a internet (en azure como lo hiciste en el módulo pasado) por qué no hace falta ponerle el puerto 443 para que sea "seguro"?
¿Dónde o quién determina que ese docker tiene https?
Si debes de habilitar el puerto 443 para que puedas habilitar HTTPS, supongo que el profesor lo omitió pero si se debe de publicar si quieres acceso seguro a tu sitio.
Como habitualmente vas a tener varios contenedores corriendo en un servidor el tema de los puertos se puede volver un tanto complicado y ademas de que its not sexy que los puertos se vean en una url productiva.
Para ello podrías configurar un nginx como un proxy reverso que sería publico en y con los puertos 80 y 443, los cuales serian los únicos expuestos. Este proxy podría enrutar a tus contenedores internos por medio de los puertos que elijas con lo cual mitigas el riesgo de tener expuestos tus contenedores con puertos y se ve mejor.
8080:5000
[puerto donde escucha tu maquina]:[puerto donde aparece la solicitud dentro del contenedor]