Redes en Docker: Bridge, Host y Overlay

Lectura
25 min~9 min lectura

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.

CONCEPTO CLAVE
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.

📌 Recuerda: Por defecto, los contenedores en diferentes redes no pueden comunicarse entre sí a menos que estén conectados a la misma red o se configuren puentes entre ellas.

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
💡 Consejo: Utiliza el comando 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.

  1. Crear una nueva red bridge personalizada:
docker network create --driver bridge mi-red-bridge
  1. Conectar un contenedor a la red personalizada:
docker run -d --name nginx-app --network mi-red-bridge nginx
  1. Conectar un contenedor existente a la red:
docker network connect mi-red-bridge otro-contenedor
⚠️ Importante: La red bridge por defecto de Docker no permite la resolución DNS automática entre contenedores. Por eso es crucial crear redes bridge personalizadas que sí ofrecen esta funcionalidad mediante el driver 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
📌 Caso de uso: La red host es ideal para aplicaciones que requieren el máximo rendimiento de red o que necesitan acceder directamente a los interfaces de red del sistema sin traducción.
"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 No
Resolución DNS Sí (personalizada) No
Rendimiento Buena Excelente
Puertos propios Sí (mapeados) Sí (directos)
⚠️ Precaución en Linux: En sistemas Linux, si usas la red host con un contenedor que expone un puerto que ya está en uso por el host, el contenedor fallará al iniciar. En macOS y Windows, Docker ejecuta los contenedores dentro de una máquina virtual, por lo que la red host se refiere a esa VM.

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
CONCEPTO CLAVE
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
  1. Crear una red overlay para microservices:
docker network create --driver overlay --attachable mi-micro-red
  1. 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
💡 Optimización: Agrupa tus servicios por dominio funcional usando redes overlay separadas. Por ejemplo, una red para el frontend, otra para el backend y otra para servicios de datos. Esto mejora la seguridad y el rendimiento al reducir el tráfico innecesario entre dominios.

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

📌 Comandos esenciales: Dominar estos comandos te permitirá diagnosticar y resolver problemas de red rápidamente en tus despliegues.
# 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
💡 Diseño seguro: Al separar las redes, el frontend solo puede comunicarse con la API, la API puede comunicarse con el frontend y la base de datos, pero la base de datos solo acepta conexiones de la API. Esto sigue el principio de mínimo privilegio.

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
⚠️ Depuración: Si experimentas problemas de conectividad, usa 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

  1. Usa redes bridge personalizadas en lugar de la red bridge por defecto para obtener resolución DNS automática.
  2. Agrupa contenedores relacionados en la misma red y aísla los que no necesitan comunicarse.
  3. Utiliza la red host solo cuando el rendimiento sea crítico y entiendas las implicaciones de seguridad.
  4. Emplea redes overlay para aplicaciones distribuidas y microservicios en producción.
  5. 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."
🧠 Quiz

¿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
✅ Respuesta correcta: B) Resolución DNS automática entre contenedores. La red bridge por defecto no proporciona resolución DNS automática, mientras que las redes bridge personalizadas sí permiten que los contenedores se comuniquen usando nombres en lugar de direcciones IP.
🧠 Quiz

¿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
✅ Respuesta correcta: B) Cuando requieres el máximo rendimiento de red y no necesitas aislamiento. La red host elimina la capa de virtualización de red, reduciendo la latencia, pero el contenedor comparte la pila de red del host sin aislamiento.
🧠 Quiz

¿Qué tipo de red necesitas para que contenedores en diferentes servidores Docker se comuniquen entre sí?

  • A) Bridge
  • B) Host
  • C) Overlay
  • D) None
✅ Respuesta correcta: C) Overlay. La red overlay permite la comunicación entre contenedores distribuidos en múltiples hosts, utilizando el protocolo VXLAN para crear redes virtuales sobre la infraestructura existente.

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.