Redes en Docker: Bridge, Host y Overlay
En el ecosistema de Docker, las redes son fundamentales para la comunicación entre contenedores, así como entre contenedores y el mundo exterior. Comprender cómo Docker gestiona las redes te permitirá diseñar arquitecturas más robustas, seguras y eficientes. En esta lección exploraremos los tres tipos principales de redes en Docker: Bridge, Host y Overlay.
Docker proporciona un subsistema de red independiente que permite a los contenedores comunicarse entre sí y con el exterior. Cada red virtual opera como un switch aislado, y los contenedores pueden conectarse a múltiples redes simultáneamente.
¿Por qué importan las redes en Docker?
Cuando inicias un contenedor sin especificar una red, Docker lo conecta automáticamente a la red bridge por defecto. Sin embargo, esta configuración predeterminada puede no ser suficiente para aplicaciones distribuidas o microservicios que requieren comunicación directa entre servicios.
Tipos de redes en Docker
1. Red Bridge (Puente)
La red bridge es la más común y la que Docker crea automáticamente. Funciona como un puente virtual entre el contenedor y la red del host. Cada contenedor obtiene su propia dirección IP dentro de la subred del puente.
# Ver las redes disponibles
docker network ls
# Ver detalles de la red bridge por defecto
docker network inspect bridge
docker network inspect frecuentemente para visualizar la configuración de red de tus contenedores y verificar que las conexiones son las esperadas.Creando una red bridge personalizada
Aunque Docker proporciona una red bridge por defecto, es recomendable crear redes bridge personalizadas para tus proyectos, ya que ofrecen mayor control y aislamiento.
- Crear una nueva red bridge personalizada:
docker network create --driver bridge mi-red-bridge
- Conectar un contenedor a la red personalizada:
docker run -d --name nginx-app --network mi-red-bridge nginx
- Conectar un contenedor existente a la red:
docker network connect mi-red-bridge otro-contenedor
bridge actualizado.2. Red Host
La red host elimina el aislamiento de red entre el contenedor y el host de Docker. El contenedor comparte directamente la pila de red del host y no tiene su propia dirección IP asignada.
docker run -d --name app-rapida --network host mi-aplicacion
"Al usar la red host, el servicio dentro del contenedor está disponible directamente en el puerto 80 del host, sin mapeo de puertos adicional. Esto elimina la capa de virtualización de red y reduce la latencia."
| Característica | Bridge | Host |
|---|---|---|
| Aislamiento | Sí | No |
| Resolución DNS | Sí (personalizada) | No |
| Rendimiento | Buena | Excelente |
| Puertos propios | Sí (mapeados) | Sí (directos) |
3. Red Overlay (Superposición)
La red overlay permite la comunicación entre contenedores distribuidos en múltiples hosts Docker. Es el pilar fundamental de Docker Swarm y los servicios orquestados. Utiliza el protocolo VXLAN para crear redes virtuales sobre la infraestructura de red existente.
# Inicializar un swarm (si no existe)
docker swarm init
# Crear una red overlay
docker network create --driver overlay mi-red-overlay
Las redes overlay requieren un cluster de Docker en modo Swarm. Sin embargo, con la opción
attachable, también puedes conectar contenedores individuales (no servicios) a una red overlay existente.
# Red overlay attachable para contenedores standalone
docker network create --driver overlay --attachable mi-red-overlay
- Crear una red overlay para microservices:
docker network create --driver overlay --attachable mi-micro-red
- Desplegar servicios conectados a la red overlay:
docker service create --name api-service --network mi-micro-red -p 3000:3000 mi-api:latest
docker service create --name db-service --network mi-micro-red mi-database:latest
Comunicación entre contenedores
Resolución DNS automática
En redes bridge personalizadas, overlay y macvlan, Docker proporciona resolución DNS automática. Esto significa que puedes referirte a otros contenedores por su nombre en lugar de recordar direcciones IP.
# Desde un contenedor, puedes hacer ping a otro por su nombre
docker exec contenedor-a ping -c 3 contenedor-b
# La respuesta muestra la resolución DNS funcionando
# PING contenedor-b (172.18.0.2): 56 data bytes
Ver más: Configuración de red avanzada
Redes personalizadas adicionales
Docker ofrece drivers adicionales que no cubrimos en detalle pero que son útiles en escenarios específicos:
- macvlan: Asigna direcciones MAC reales a los contenedores, haciéndolos appear como dispositivos físicos en tu red.
- none: Desactiva completamente la red en un contenedor.
- ipvlan: Similar a macvlan pero comparte la dirección MAC del host.
# Crear una red macvlan
docker network create --driver macvlan \
--subnet=192.168.1.0/24 \
--gateway=192.168.1.1 \
-o parent=eth0 mi-macvlan
Gestión práctica de redes
# Listar todas las redes
docker network ls
# Inspeccionar una red específica
docker network inspect mi-red-bridge
# Ver qué contenedores están conectados
docker network inspect mi-red-bridge --format '{{range .Containers}}{{.Name}}\n{{end}}'
# Desconectar un contenedor de una red
docker network disconnect mi-red-bridge contenedor-ejemplo
# Eliminar una red (debe estar vacía)
docker network rm mi-red-no-utilizada
# Limpiar redes no utilizadas
docker network prune
Ejemplo práctico: Aplicación de tres niveles
Imaginemos una aplicación web típica con frontend (Nginx), API (Node.js) y base de datos (PostgreSQL). Veamos cómo configurar las redes apropiadamente:
# 1. Crear redes separadas para cada nivel
docker network create --driver bridge red-frontend
docker network create --driver bridge red-backend
docker network create --driver bridge red-database
# 2. Crear la base de datos
docker run -d \
--name postgres-db \
--network red-database \
-e POSTGRES_PASSWORD=secreto \
postgres:14
# 3. Crear la API
docker run -d \
--name api-node \
--network red-backend \
--network red-database \
mi-api:latest
# 4. Crear el frontend
docker run -d \
--name frontend-nginx \
--network red-frontend \
--network red-backend \
-p 80:80 \
nginx:alpine
Solución de problemas comunes
| Problema | Causa probable | Solución |
|---|---|---|
| Contenedores no se comunican | Están en redes diferentes | Usar docker network connect o revisar la configuración |
| DNS no resuelve nombres | Usando bridge por defecto | Crear una red bridge personalizada |
| Conflicto de puertos | Usando red host con puerto ocupado | Detener el servicio del host o usar bridge con mapeo |
| Overlay no funciona | No hay Swarm activo | Inicializar con docker swarm init |
docker exec -it contenedor bash y ejecuta cat /etc/hosts para verificar las entradas DNS de Docker, o ip addr para ver las interfaces de red del contenedor.Resumen y mejores prácticas
- Usa redes bridge personalizadas en lugar de la red bridge por defecto para obtener resolución DNS automática.
- Agrupa contenedores relacionados en la misma red y aísla los que no necesitan comunicarse.
- Utiliza la red host solo cuando el rendimiento sea crítico y entiendas las implicaciones de seguridad.
- Emplea redes overlay para aplicaciones distribuidas y microservicios en producción.
- Documenta tu topología de red para facilitar el mantenimiento y la resolución de problemas.
"Una arquitectura de red bien diseñada es tan importante como el código de tu aplicación. Invertir tiempo en planificar las redes desde el inicio te ahorrará horas de depuración más adelante."
¿Cuál es la principal ventaja de crear redes bridge personalizadas en lugar de usar la red bridge por defecto de Docker?
- A) Mayor velocidad de transferencia de datos
- B) Resolución DNS automática entre contenedores
- C) Posibilidad de usar puertos sin mapeo
- D) Compatibilidad con Docker Swarm
¿En qué escenario es más apropiado utilizar la red host en lugar de bridge?
- A) Cuando necesitas aislar completamente los contenedores
- B) Cuando requieres el máximo rendimiento de red y no necesitas aislamiento
- C) Cuando trabajas con múltiples hosts en un cluster
- D) Cuando quieres evitar configurar puertos mapeados
¿Qué tipo de red necesitas para que contenedores en diferentes servidores Docker se comuniquen entre sí?
- A) Bridge
- B) Host
- C) Overlay
- D) None
Conclusión
Las redes en Docker son un pilar fundamental para construir aplicaciones robustas y escalables. Comprender las diferencias entre Bridge, Host y Overlay, saber cuándo usar cada una y aplicar las mejores prácticas de diseño te permitirá crear arquitecturas más seguras, eficientes y mantenibles. En la próxima lección exploraremos cómo combinar estas redes con Docker Compose para definir arquitecturas completas de forma declarativa.