Redes de Contenedores Docker: Una Guía Práctica
Redes de Contenedores Docker: Una Guía Práctica
Cuando empiezas a trabajar con Docker, una de las primeras complejidades que encuentras es cómo los contenedores se comunican entre sí y con el mundo exterior. Las redes de contenedores Docker explicadas de forma sencilla son el sistema de redes virtuales y reglas que permiten esta comunicación, proporcionando aislamiento, seguridad y conectividad para tus aplicaciones contenerizadas. Comprender estos conceptos no es solo teoría; es fundamental para construir despliegues de contenedores seguros, escalables y mantenibles.
Qué Aprenderás
Entenderás los conceptos centrales del modelo de redes de Docker, desde el bridge predeterminado hasta los controladores especializados, y aprenderás a configurar redes seguras y aisladas para tus contenedores. Al final, podrás diseñar topologías de red que aíslen servicios sensibles, habiliten el descubrimiento de servicios sin problemas y solucionen problemas comunes de conectividad, siendo la conclusión clave que las redes bridge definidas por el usuario son muy superiores al bridge predeterminado para la mayoría de los casos de uso en producción.
El Núcleo de las Redes Docker
En esencia, las redes de contenedores se refieren a la capacidad de los contenedores para conectarse y comunicarse entre sí, y con servicios de red que no son Docker. Por defecto, los contenedores tienen las redes habilitadas y pueden realizar conexiones salientes. Un contenedor ve una interfaz de red con una dirección IP, una puerta de enlace, una tabla de enrutamiento y servicios DNS, pero no tiene información sobre el tipo de red al que está conectado ni si sus pares también son contenedores Docker.
Cuando el motor de Docker se inicia en Linux por primera vez, crea una única red incorporada llamada red "bridge predeterminada". Si ejecutas un contenedor sin la opción --network, se conecta a este bridge predeterminado. Aunque funcional, esta configuración predeterminada tiene limitaciones significativas, siendo la más notable la falta de resolución DNS automática entre contenedores.
Redes Bridge Definidas por el Usuario: La Opción Superior
Para cualquier aplicación seria, debes crear redes bridge definidas por el usuario. Estas redes personalizadas ofrecen varias ventajas críticas sobre el bridge predeterminado:
Resolución DNS Automática: Los contenedores en un bridge definido por el usuario pueden resolverse entre sí por nombre de contenedor o alias. Por ejemplo, un contenedor
webpuede conectarse a un contenedordbsimplemente usando el nombre de hostdb. Esto no es posible en el bridge predeterminado, que requiere las banderas heredadas--linko la manipulación manual de/etc/hosts.Mejor Aislamiento: Todos los contenedores sin un
--networkespecificado se conectan a la red bridge predeterminada, creando un riesgo donde contenedores no relacionados pueden comunicarse. Las redes definidas por el usuario proporcionan una red con alcance, aislando los contenedores entre sí a menos que estén explícitamente conectados.Conectar y Desconectar Sobre la Marcha: Puedes conectar o desconectar un contenedor en ejecución de redes definidas por el usuario sin reiniciarlo. Para cambiar la red de un contenedor en el bridge predeterminado, debes detenerlo y recrearlo.
Google AdInline article slotBridges Configurables: Cada red definida por el usuario se puede configurar con sus propios ajustes (como MTU y reglas de firewall), lo que te permite adaptar las redes para diferentes necesidades de aplicación.
Cómo Crear y Usar una Red Bridge Personalizada
Crear y usar una red bridge personalizada es sencillo. Esta es la base de una configuración de redes Docker segura y manejable.
Paso 1: Crear la red.
docker network create mi-red-segura
Por defecto, esto crea una red bridge. También puedes especificar un controlador con la bandera -d (por ejemplo, docker network create -d bridge mi-red).
Paso 2: Ejecutar contenedores en esta red.
docker run -d --name web --network mi-red-segura nginx
docker run -d --name db --network mi-red-segura postgres
El contenedor web ahora puede comunicarse con el contenedor db usando el nombre de host db.
Paso 3: Conectar un contenedor en ejecución a la red.
docker network connect mi-red-segura contenedor-ya-en-ejecucion
Un contenedor puede estar conectado a múltiples redes simultáneamente, una característica poderosa para crear patrones de red complejos, como un frontend conectado tanto a una red externa como a una red interna de backend.
Controladores de Red Clave y Sus Casos de Uso
Las redes de Docker son conectables, utilizando controladores para proporcionar funcionalidad central. Aquí tienes un desglose de los controladores principales que encontrarás.
| Controlador | Descripción | Mejor Para |
|---|---|---|
| bridge | El controlador de red predeterminado. Crea una red interna privada en el host. | Aplicaciones de un solo host donde los contenedores necesitan comunicarse entre sí. Es la opción estándar y más común. |
| host | Elimina el aislamiento de red. El contenedor comparte la pila de red del host directamente. | Aplicaciones críticas de rendimiento o servicios que necesitan gestionar muchos puertos u operaciones a nivel de red (por ejemplo, un servidor DNS/DHCP de toda la red como Pi-hole). Advertencia de seguridad: Este modo elimina una capa clave de aislamiento. |
| none | Deshabilita las redes para un contenedor. Solo tiene una interfaz de loopback (lo). |
Trabajos altamente aislados como procesamiento por lotes sin conexión o tareas que no necesitan acceso a la red. |
| overlay | Conecta múltiples demonios de Docker, permitiendo la comunicación entre hosts. | Clústeres de Docker Swarm y aplicaciones multi-host. |
| macvlan | Asigna una dirección MAC a un contenedor, haciéndolo aparecer como un dispositivo físico en tu red. | Aplicaciones heredadas o migraciones de máquinas virtuales donde el contenedor necesita estar directamente en la red física. |
| ipvlan | Similar a macvlan pero sin direcciones MAC únicas, dando control total sobre el direccionamiento IPv4/IPv6. | Entornos de red donde hay una restricción en la cantidad de direcciones MAC que se pueden asignar. |
Para la mayoría de los desarrolladores, el controlador bridge —específicamente, un bridge definido por el usuario— será la herramienta principal en su arsenal.
Comprendiendo el Modo Host en Profundidad
El controlador de red host es una herramienta poderosa pero especializada. Elimina el aislamiento de red entre el contenedor y el host de Docker, lo que significa que el contenedor usa la pila de red del host directamente. Como señaló un profesional, esto es ideal para servicios que requieren manejo de tráfico de difusión, como servicios DNS y DHCP.
⚠️ Advertencia Crucial: Las redes en modo host no son multiplataforma. Funciona como se espera solo en hosts Linux. En macOS y Windows (a través de Docker Desktop), se comporta de manera diferente debido a la implementación de la máquina virtual. Además, pierdes la capacidad de usar el descubrimiento de servicios DNS de Docker para el contenedor y no puedes conectarlo a otras redes mientras está en modo host.
Ejemplo con Docker Compose:
version: "3"
services:
web:
image: nginx:latest
network_mode: host
Este contenedor será directamente accesible en la dirección IP de tu host. No se necesita una directiva ports.
Publicación de Puertos: Conectando Contenedores al Mundo Exterior
Por defecto, los puertos en las redes bridge no son accesibles desde fuera del host. Para hacer que un servicio esté disponible externamente, publicas puertos usando la bandera -p o --publish.
docker run -d -p 8080:80 --name servidor-web nginx
Esto mapea el puerto 8080 en el host de Docker al puerto 80 en el contenedor. El tráfico que llega a la IP de tu host en el puerto 8080 se reenvía al contenedor.
- Para publicar todos los puertos expuestos, usa la bandera
-P. - Para restringir el acceso solo a localhost, publica en
127.0.0.1:docker run -p 127.0.0.1:8080:80 nginx. - Es importante tener en cuenta que no necesitas publicar puertos para que los contenedores en la misma red bridge se comuniquen entre sí; pueden hacerlo directamente usando sus nombres de contenedor y puertos.
DNS y Descubrimiento de Servicios
Por defecto, los contenedores heredan la configuración DNS del host de Docker. Sin embargo, existe una diferencia crítica:
- Red Bridge Predeterminada: Los contenedores reciben una copia del archivo
/etc/resolv.confdel host. - Redes Definidas por el Usuario: Los contenedores usan el servidor DNS integrado de Docker en
127.0.0.11. Este servidor reenvía las consultas DNS externas a los servidores configurados del host. Este DNS integrado es lo que permite la mágica resolución de nombres de contenedores. Si una aplicación dentro de un contenedor necesita consultar explícitamente el servidor DNS de Docker, debe usar la dirección127.0.0.11.
Puedes anular la configuración DNS por contenedor usando banderas como --dns, --dns-search y --dns-opt.
Flujo de Trabajo Práctico: Cambiar la Red de un Contenedor
Cambiar la configuración de red de un contenedor se puede hacer, pero hay limitaciones importantes.
Para un contenedor en una red bridge: Puedes conectarlo y desconectarlo de las redes sobre la marcha.
# Conectar un contenedor en ejecución a una red personalizada docker network connect mi-nueva-red mi-contenedor # Desconectarlo del bridge predeterminado docker network disconnect bridge mi-contenedorNo puedes desconectar un contenedor de su última red; siempre debe estar conectado al menos a una.
Para un contenedor en una red host: Es imposible cambiar su configuración de red o conectarlo a otra red mientras se está ejecutando. Encontrarás un error si lo intentas:
Error response from daemon: container sharing network namespace with another container or host cannot be connected to any other networkPara cambiar su red, debes detener, eliminar y recrear el contenedor, preservando su configuración usando las mismas variables de entorno, volúmenes y otras configuraciones.
Preguntas Frecuentes
¿Cuál es la diferencia entre el bridge predeterminado y una red bridge definida por el usuario? La diferencia más importante es la resolución DNS automática: los contenedores en un bridge definido por el usuario pueden comunicarse por nombre de contenedor, mientras que los contenedores en el bridge predeterminado solo pueden alcanzarse entre sí por dirección IP. Las redes definidas por el usuario también ofrecen mejor aislamiento y la flexibilidad de conectar/desconectar contenedores sobre la marcha.
¿Cómo hago que un contenedor sea accesible desde mi red local o internet?
Debes publicar los puertos del contenedor usando la bandera -p o --publish. Por ejemplo, -p 8080:80 mapea el puerto 8080 en tu host de Docker al puerto 80 en el contenedor, haciendo que el servicio esté disponible en la dirección IP de tu host.
¿Puedo conectar un contenedor a múltiples redes?
Sí, esta es una característica poderosa. Un contenedor puede estar conectado a múltiples redes simultáneamente usando la bandera --network varias veces al crearlo o el comando docker network connect para contenedores en ejecución. Esto es útil para crear una aplicación con redes tanto externas como internas privadas.
¿Por qué no puedo hacer ping a mis contenedores desde el host de Docker?
En Docker Desktop para Mac y Windows, no puedes hacer ping a contenedores Linux directamente desde el host debido a cómo se implementan las redes dentro de la máquina virtual. Esta es una limitación conocida, y la interfaz bridge docker0 no es visible en el host. Sin embargo, un usuario de Windows puede hacer ping a contenedores Windows.
¿Cuándo debo usar el controlador de red host?
Debes usar el controlador host solo para casos de uso específicos donde el rendimiento nativo de la red es crítico o el servicio necesita manejar funciones a nivel de red (como un servidor DNS/DHCP). Esto tiene el costo de la seguridad y la portabilidad, ya que solo funciona de manera confiable en Linux y elimina el aislamiento de red.
Fuentes
- Docker Docs. "Networking overview." https://docs.docker.com/engine/network/
- GitHub. "arnab-logs/understanding-docker-networks." https://github.com/arnab-logs/understanding-docker-networks
- Docker Docs. "Explore networking how-tos on Docker Desktop." https://docs.docker.com/desktop/features/networking/networking-how-tos/
- Docker Docs. "Network drivers." https://docs.docker.com/engine/network/drivers/
- Docker Docs (Chinese translation). "网络 | 容器教程." https://docs.dockerd.com.cn/engine/network/
- Linux Handbook. "Using Docker Compose with Host Network Configuration." https://linuxhandbook.com/docker-compose-host-network-configuration/
- Docker Docs. "Bridge network driver." https://docs.docker.com/engine/network/drivers/bridge/
- Baeldung. "How to Change the Network of a Running Docker Container?" https://www.baeldung.com/ops/docker-container-change-network
— Editorial Team
Aún no hay comentarios.