Redes de conexiones azul representando networking en Docker
|

Networking en Docker: bridge, host y overlay explicados

Cuando empiezas con Docker, los contenedores funcionan y no te preguntas mucho más. Pero en cuanto tienes varios que necesitan comunicarse, o quieres exponer un servicio al exterior, necesitas entender el networking en Docker. En este post te explico las redes bridge, host y overlay con ejemplos prácticos.

Cómo funciona el networking en Docker

Docker crea una capa de red virtual entre los contenedores y el host. Cada contenedor tiene su propia interfaz de red con su propia IP. Docker gestiona esto mediante drivers de red: bridge, host, none y overlay. Consulta la documentación oficial de Docker networking para más detalle.

# Ver todas las redes de Docker
docker network ls

# NETWORK ID     NAME      DRIVER    SCOPE
# a1b2c3d4e5f6   bridge    bridge    local
# b2c3d4e5f6a1   host      host      local
# c3d4e5f6a1b2   none      null      local

Red Bridge: la red por defecto en Docker

Bridge es el driver por defecto. Docker crea una interfaz virtual llamada docker0 y cada contenedor obtiene una IP en la subred 172.17.0.0/16.

Red bridge por defecto — limitaciones

# Los contenedores en bridge por defecto no se comunican por nombre
docker run -d --name contenedor1 nginx
docker run -d --name contenedor2 nginx

# Esto falla:
docker exec contenedor1 ping contenedor2  # no resuelve por nombre

# Hay que usar la IP directamente
docker exec contenedor1 ping 172.17.0.3

Red bridge personalizada: la forma correcta de networking en Docker

Creando tu propia red bridge, los contenedores se comunican por nombre. Esto es lo que deberías usar siempre en proyectos reales:

# Crear una red bridge personalizada
docker network create mi-red

# Conectar contenedores a la red
docker run -d --name web --network mi-red nginx
docker run -d --name db --network mi-red mysql:8.0

# Ahora funciona la resolución por nombre
docker exec web ping db   # funciona

# Inspeccionar la red
docker network inspect mi-red

# Conectar un contenedor existente
docker network connect mi-red mi-contenedor

# Desconectar
docker network disconnect mi-red mi-contenedor

Esto es exactamente lo que hace Docker Compose automáticamente. Si quieres ver cómo configurar redes en Compose, consulta el post de Docker Compose completo.

Red Host: networking en Docker sin aislamiento

Con el driver host, el contenedor comparte directamente la pila de red del host. Sin NAT, sin puertos mapeados. El contenedor usa las mismas interfaces y la misma IP que el host.

# Ejecutar con red host
docker run -d --network host nginx

# Nginx escucha en el puerto 80 del HOST directamente
# No hace falta mapear puertos con -p

# Verificar
ss -tlnp | grep :80
SituaciónRecomendación
Máximo rendimiento de redHost — elimina el overhead de NAT
Monitorización del host (Prometheus node_exporter)Host — necesita acceso a interfaces del host
Aislamiento entre contenedoresNo usar host — usa bridge personalizado

Importante: la red host solo funciona en Linux. En macOS y Windows, Docker corre en una VM y el modo host no tiene el mismo efecto.

Red None: contenedor completamente aislado

# Sin acceso a red — solo loopback
docker run --network none alpine ping google.com
# ping: google.com: Name or service not known

Útil para tareas de procesamiento que no necesitan comunicación externa.

Red Overlay: networking Docker en múltiples hosts

El driver overlay permite comunicación entre contenedores en diferentes hosts Docker. Es el driver que usa Docker Swarm para crear redes distribuidas.

# Inicializar Docker Swarm
docker swarm init

# Crear una red overlay
docker network create --driver overlay mi-red-overlay

# Desplegar un servicio en la red overlay
docker service create   --name mi-servicio   --network mi-red-overlay   --replicas 3   nginx

Comandos esenciales de Docker networking

# Listar redes
docker network ls

# Crear red bridge personalizada
docker network create mi-red

# Crear con subred específica
docker network create --subnet 192.168.100.0/24 mi-red-custom

# Inspeccionar red
docker network inspect mi-red

# Eliminar red
docker network rm mi-red

# Eliminar redes sin usar
docker network prune

Exponer puertos en Docker: -p vs –expose

# -p: mapea puerto del host al contenedor
docker run -d -p 8080:80 nginx

# Solo en localhost del host
docker run -d -p 127.0.0.1:8080:80 nginx

# Puerto aleatorio del host
docker run -d -p 80 nginx
docker port mi-contenedor

# --expose: documenta el puerto pero no lo publica
docker run -d --expose 80 nginx

Tabla resumen: drivers de red en Docker

DriverCuándo usarloResolución por nombre
Bridge (default)Contenedor único sin comunicaciónNo
Bridge (custom)Múltiples contenedores en el mismo hostSi
HostMáximo rendimiento, monitorizaciónN/A
NoneContenedor completamente aisladoNo
OverlayContenedores en múltiples hostsSi

Conclusión

Para el 90% de los casos, una red bridge personalizada es todo lo que necesitas. Crea una red por aplicación, conecta tus contenedores y deja que Docker gestione la resolución de nombres. Reserva la red host para casos donde el rendimiento sea crítico o necesites acceso directo a las interfaces del host.

En el próximo post entramos en Kubernetes para principiantes — el salto natural desde Docker. Tienes dudas sobre redes en Docker? Déjalas en los comentarios.

¡No te pierdas los próximos posts!

¡No hacemos spam! Lee nuestra política de privacidad para obtener más información.

Publicaciones Similares

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *