La publicación de puertos es una técnica de red en Docker que vincula un puerto específico de la máquina anfitriona (Host) con un puerto interno del contenedor, creando un túnel que permite al tráfico externo atravesar el aislamiento.
Por defecto, los contenedores son búnkeres herméticos. Pueden salir a internet (para descargar actualizaciones), pero nadie puede entrar.
Imagina que has descargado la imagen de Nginx. Has ejecutado docker run nginx. Docker te dice que el contenedor está corriendo. Todo parece perfecto.
Abres tu navegador, escribes localhost, das a Enter y… “No se puede conectar”. ¿Qué ha pasado? La respuesta está en lo que vimos en el capítulo anterior: El Aislamiento.
Hoy vamos a ver la Publicación de Puertos para gestionar la publicación de puertos, permitiendo que tus servicios sean accesibles desde fuera del contendor 👇.
La anatomía del flag -p
Para permitir el tráfico entrante, tenemos que decirle explícitamente a Docker que conecte un puerto de nuestra máquina (Host) con un puerto del contenedor.
Esto se hace con el flag -p (minúscula), y la sintaxis es:
-p <PUERTO_HOST>:<PUERTO_CONTENEDOR>
Siempre es “de fuera hacia dentro”. Primero va MI ordenador (donde estoy escribiendo), luego va el CONTENEDOR.
Ejemplo Práctico: El Servidor Web
Imaginemos que lanzamos un servidor Nginx. Internamente, Nginx está configurado de fábrica para escuchar en el puerto 80. Ese es el puerto del contenedor (lado derecho).
Ahora tenemos que decidir por qué puerto de nuestro PC (lado izquierdo) queremos acceder.
Queremos entrar por el puerto 8080 de nuestro ordenador.
docker run -d -p 8080:80 nginx
- Acceso: Vamos al navegador y escribimos
localhost:8080. - Flujo: Petición llega a mi PC (8080) ➡️ Docker la captura ➡️ La envía al Contenedor (80). ¡Funciona! 👍
Restringiendo la IP
Por defecto, cuando haces -p 8080:80, Docker publica ese puerto en todas las interfaces de red de tu ordenador (0.0.0.0).
Esto significa que si estás en una red WiFi pública o en una oficina:
- Tú puedes acceder por
localhost:8080. - Tu compañero de al lado puede acceder poniendo tu IP
192.168.1.55:8080.
A veces no queremos esto. Si solo quieres que sea accesible desde TU ordenador (localhost) y nadie más, puedes especificar la IP de loopback:
docker run -d -p 127.0.0.1:8080:80 nginx
