Volver al inicio

Explicación de la Red de Contenedores Docker: Una Guía Práctica

Esta guía completa explica la red de contenedores Docker desde cero, cubriendo las limitaciones del bridge predeterminado, las ventajas del bridge definido por el usuario, los controladores de red clave, el descubrimiento de servicios DNS, la publicación de puertos y los pasos de configuración práctica. Equipa a desarrolladores y administradores de sistemas con el conocimiento para construir aplicaciones contenedorizadas seguras, aisladas y escalables.

Redes Docker: Guía Completa para Contenedores
Advertisement 728x90

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.

Google AdInline article slot

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:

Google AdInline article slot
  1. 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 web puede conectarse a un contenedor db simplemente usando el nombre de host db. Esto no es posible en el bridge predeterminado, que requiere las banderas heredadas --link o la manipulación manual de /etc/hosts.

  2. Mejor Aislamiento: Todos los contenedores sin un --network especificado 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.

  3. 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 slot
  4. Bridges 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.conf del 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ón 127.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.

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

    No puedes desconectar un contenedor de su última red; siempre debe estar conectado al menos a una.

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

    Para 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

— Editorial Team

Advertisement 728x90

Leer después