La red de Docker confunde a muchos principiantes — ¿por qué mi contenedor no puede hablar con otro? ¿Qué diferencia hay entre bridge, host y overlay? Esta guía explica cómo funciona el networking de Docker con ejemplos concretos.
Cómo funciona la red en Docker
Cuando instalas Docker, crea automáticamente tres redes: bridge, host y none. Por defecto, los contenedores se conectan a la red bridge estándar, pero esta tiene limitaciones importantes — los contenedores no pueden resolverse por nombre.
# Ver redes disponibles
docker network ls
# NETWORK ID NAME DRIVER SCOPE
# abc123 bridge bridge local
# def456 host host local
# ghi789 none null local
Tipos de redes Docker
| Driver | Aislamiento | Resolución DNS | Cuándo usar |
|---|---|---|---|
| bridge (default) | Sí | Solo por IP | Evitar — usa redes custom |
| bridge (custom) | Sí | Por nombre | Desarrollo local, Compose |
| host | No | N/A | Rendimiento máximo, Linux solo |
| overlay | Sí | Por nombre | Docker Swarm, múltiples hosts |
| none | Total | N/A | Contenedores completamente aislados |
Bridge personalizada: la forma correcta
Crear tu propia red bridge habilita DNS automático — los contenedores se encuentran por nombre. Es lo que usa Docker Compose internamente.
# Crear red personalizada
docker network create mi-red
# Conectar contenedores a esa red
docker run -d --name db --network mi-red mariadb:11
docker run -d --name app --network mi-red \
-e DB_HOST=db \ # ← resuelve por nombre del contenedor
mi-app:latest
# Ahora "app" puede llegar a "db" con solo usar el nombre "db"
docker exec app ping db
Publicar puertos: -p y --publish
# Publicar puerto 80 del contenedor en el 8080 del host
docker run -p 8080:80 nginx
# Publicar solo en localhost (más seguro)
docker run -p 127.0.0.1:8080:80 nginx
# Múltiples puertos
docker run -p 80:80 -p 443:443 nginx
# Puerto aleatorio del host
docker run -p 80 nginx
docker port <container_id> # ver qué puerto asignó
EXPOSE en el Dockerfile es solo documentación — no abre ningún puerto en el host. Para acceder desde el host necesitas -p al correr el contenedor.
Networking en Docker Compose
Compose crea automáticamente una red bridge personalizada para cada proyecto y conecta todos los servicios a ella. Los servicios se alcanzan por su nombre de servicio:
services:
web:
build: .
ports:
- "80:80"
networks:
- frontend
- backend
app:
image: mi-app:latest
networks:
- backend
db:
image: mariadb:11
networks:
- backend
# NO expone puertos al host — solo accesible desde la red backend
networks:
frontend:
backend:
web puede hablar con app y db. Pero db no es accesible desde internet — solo desde la red interna backend. Esta es la arquitectura correcta para no exponer la base de datos.
Diagnóstico de red
# Inspeccionar una red: ver qué contenedores están conectados
docker network inspect mi-red
# Ver la IP de un contenedor
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' mi-contenedor
# Probar conectividad entre contenedores
docker exec mi-app ping db
docker exec mi-app curl http://db:3306
# Ver puertos que expone un contenedor
docker port mi-contenedor
"En Docker, la red es invisible hasta que algo falla — entonces necesitas entenderla bien. Aprende primero, debuggea menos después."