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