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ón | Recomendación |
|---|---|
| Máximo rendimiento de red | Host — elimina el overhead de NAT |
| Monitorización del host (Prometheus node_exporter) | Host — necesita acceso a interfaces del host |
| Aislamiento entre contenedores | No 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
| Driver | Cuándo usarlo | Resolución por nombre |
|---|---|---|
| Bridge (default) | Contenedor único sin comunicación | No |
| Bridge (custom) | Múltiples contenedores en el mismo host | Si |
| Host | Máximo rendimiento, monitorización | N/A |
| None | Contenedor completamente aislado | No |
| Overlay | Contenedores en múltiples hosts | Si |
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.
