Los contenedores están aislados del sistema host y de la red exterior.
Esto significa que, por defecto, los servicios que se ejecutan dentro de un contenedor no son accesibles desde fuera.
Para permitir el acceso es necesario publicar puertos.
Las aplicaciones dentro del contenedor escuchan en puertos internos.
Ejemplos típicos:
Estos puertos existen dentro del contenedor, no en el host.
Por lo tanto, aunque el servicio esté funcionando correctamente, no será accesible desde el exterior si no se publica el puerto.
Docker permite mapear un puerto del host hacia un puerto del contenedor.
Conceptualmente:
Host:8080 → Contenedor:80
Esto significa que una petición al puerto 8080 del host se redirige al puerto 80 del contenedor.
En Docker Compose los puertos se publican mediante la sección ports:.
Ejemplo:
services:
web:
image: nginx
ports:
- "8080:80"
Esto significa:
Puerto 8080 del host
↓
Puerto 80 del contenedor
Ahora el servidor web será accesible desde:
http://host:8080
También es posible publicar el mismo puerto en host y contenedor.
Ejemplo:
ports:
- "80:80"
Esto permite acceder al servicio usando directamente:
http://host
El sistema de publicación de puertos funciona bien para entornos simples, pero tiene algunas limitaciones:
Por ejemplo:
app1 → puerto 8080
app2 → puerto 8081
app3 → puerto 8082
Esto no escala bien cuando hay muchos servicios.
Para resolver este problema normalmente se utiliza un reverse proxy.
Un reverse proxy es un servicio que recibe las peticiones desde Internet y las redirige al contenedor correcto.
Ejemplo:
Internet
│
▼
Reverse Proxy (Traefik / Nginx)
│
├── app1
├── app2
└── app3
Esto permite:
Este patrón es muy común en Docker Compose.
En Kubernetes este problema se resuelve mediante otros mecanismos.
Equivalencias conceptuales:
| Docker | Kubernetes |
|---|---|
| ports | Service |
| reverse proxy | Ingress Controller |
Por eso es importante entender primero cómo funcionan los puertos en contenedores antes de estudiar Kubernetes.