Bridge networks y DNS en Docker | Nicolás Garzón
Texto
Copiar api namespace ─┐
├─ bridge network ─ host routing/NAT
db namespace ─┘Frente a la bridge predeterminada, una network creada explícitamente ofrece nombres DNS, aislamiento por proyecto y control más claro de membresía.
Bash
Copiar docker network create backend
docker run -d --network backend --name db postgres:17
docker run -d --network backend --name api my-apiBash
Copiar docker network inspect backendLa salida permite revisar:
driver;
subnet y gateway;
containers conectados;
aliases;
opciones;
configuración IPv4/IPv6.
La bridge predeterminada es un recurso global con comportamiento histórico. Las redes definidas por el usuario ofrecen:
DNS automático por nombre;
mejor aislamiento entre aplicaciones;
conexión/desconexión dinámica;
opciones de subnet y gateway;
aliases por network;
lifecycle explícito.
No conectes todos los containers a la red predeterminada por comodidad. Crea networks por aplicación o flujo.
Texto
Copiar api resuelve dbLa IP puede cambiar cuando db se recrea. El nombre continúa siendo la abstracción estable.
Bash
Copiar docker run --rm --network backend nicolaka/netshoot getent hosts db
docker run --rm --network backend nicolaka/netshoot dig dbLa imagen de aplicación no necesita incluir herramientas de red solo para investigar. Un container temporal en la misma network reduce la superficie del runtime.
Bash
Copiar docker network connect \
--alias postgres \
--alias database \
backend dbAliases son específicos por network. Pueden facilitar:
migración de nombres;
compatibilidad temporal;
blue/green;
consumidores con convenciones diferentes.
No uses aliases para ocultar múltiples servicios no equivalentes. Define un contrato claro.
Bash
Copiar docker network create \
--subnet 172.30 .0.0/24 \
--gateway 172.30 .0.1 \
backendFijar subnets puede ser necesario para evitar conflictos con VPN o redes corporativas. Pero aumenta responsabilidad:
evitar overlaps;
coordinar múltiples hosts;
reservar rangos;
mantener documentación;
considerar IPv6.
No asignes IP estática a cada container salvo requisito real. DNS y service discovery son más flexibles.
Bash
Copiar docker run -d \
--network backend \
-p 127.0 .0.1:3000:3000 \
--name api my-api-p crea una ruta desde host hacia el container. No modifica el puerto en el que escucha la aplicación.
Containers de backend usan:
El host port es una frontera externa, no service discovery interno.
La implementación puede utilizar reglas del host, NAT y proxies según plataforma.
Flujo de salida conceptual:
Texto
Copiar container source IP
→ bridge
→ masquerade/NAT en host
→ red externaTexto
Copiar host IP:port
→ regla de publicación
→ container IP:portNo edites reglas internas de Docker al azar. Integra firewall mediante políticas soportadas y prueba después de upgrades.
Un puerto publicado puede interactuar con reglas del host de formas que sorprenden a quien asume que un firewall genérico lo bloquea automáticamente. Verifica exposición desde otra máquina.
interfaz de bind;
firewall del host;
reglas de cloud/security group;
reverse proxy;
TLS;
autenticación;
IPv4 e IPv6.
Bash
Copiar docker network create --internal dataUna network interna limita acceso externo desde sus miembros según implementación.
database;
colas;
servicios que solo reciben tráfico interno.
Un container conectado además a otra network puede actuar como puente lógico. La topología completa importa.
Texto
Copiar proxy: public + backend
api: backend + data
db: dataCada interface tiene dirección y rutas. El DNS puede devolver respuestas según la network compartida.
No conectes un servicio a una network solo para “que resuelva”. Pregunta qué flujo de negocio necesita.
Texto
Copiar api-blue
api-green
proxyAmbas versiones viven en backend. El proxy dirige tráfico a una. Tras health y smoke tests, cambia el upstream.
DNS y aliases facilitan el cambio, pero necesitas:
compatibilidad de schema;
graceful shutdown;
rollback;
session strategy;
observabilidad.
La network no resuelve el deployment completo.
Bash
Copiar docker network inspect backendBash
Copiar docker run --rm --network backend nicolaka/netshoot getent hosts dbBash
Copiar docker run --rm --network backend nicolaka/netshoot ip routeBash
Copiar docker run --rm --network backend nicolaka/netshoot nc -zv db 5432 Bash
Copiar docker run --rm --network backend postgres:17 \
pg_isready -h db -p 5432 Bash
Copiar docker port api
curl -v http://127.0.0.1:3000/health
DNS failure: nombre/network.
No route: subnet/routing/membresía.
Refused: no listener/interfaz/puerto.
Timeout: firewall, ruta o proceso bloqueado.
HTTP 500: red funciona; falla aplicación.
TLS error: transporte llega; falla confianza o hostname.
Containers pierden acceso a ciertas redes porque la subnet Docker coincide. Elige rangos coordinados.
La IP cambia, pero la app conserva una resolución antigua. Revisa librería, TTL y reconexión.
No puede borrarse si tiene endpoints activos normalmente. La automatización debe desconectar o eliminar containers de forma ordenada.
La ruta de salida elegida puede no ser la esperada. Inspecciona ip route.
Publicar o resolver en IPv6 requiere configuración completa en daemon, network, proceso y firewall.
Pierde reemplazabilidad. Usa DNS.
Amplía superficie. Usa network compartida.
Reduce aislamiento y hace ambiguo ownership.
La aplicación todavía necesita autenticación y autorización.
User-defined bridge es el modelo normal single-host.
DNS por nombre evita depender de IPs efímeras.
Port publishing solo es necesario al cruzar hacia el host/exterior.
Networks deben modelar flujos mínimos.
Subnets requieren coordinación con VPN y redes reales.
Diagnosticar significa separar DNS, ruta, socket y protocolo.
Comprueba lo aprendido
¿Qué ventajas tiene una user-defined bridge frente a la default bridge?
Diseña una topología con proxy, API, worker, Redis y PostgreSQL.
¿Cómo detectarías un overlap de subnet con una VPN?
¿Por qué no usarías el host port para comunicación interna?
Explica un diagnóstico desde DNS hasta protocolo.
Drivers de red avanzados , donde cambia la integración con host, varios nodos o red física y aparecen trade-offs operativos mayores.