Una guía práctica de redes Docker personalizadas y comunicación entre contenedores

Esta guía ofrece una exploración práctica de las redes puente personalizadas de Docker y su papel en la comunicación entre contenedores. Aprenda cómo crear, gestionar y conectar contenedores utilizando la CLI de Docker y Docker Compose. Descubra cómo las redes personalizadas permiten la resolución DNS automática, mejoran el aislamiento y simplifican la comunicación entre servicios, lo que lleva a aplicaciones contenerizadas más robustas y escalables.

41 vistas

Una guía práctica sobre redes Docker personalizadas y comunicación entre contenedores

Docker ha revolucionado el desarrollo y el despliegue de aplicaciones al permitir a los desarrolladores empaquetar aplicaciones y sus dependencias en contenedores ligeros y portátiles. Un aspecto crucial en la gestión de aplicaciones multicontenedor es asegurar que puedan comunicarse entre sí de manera efectiva y segura. La red predeterminada de Docker, aunque funcional, a menudo se queda corta para aplicaciones complejas. Esta guía profundizará en la creación y gestión de redes Docker personalizadas, centrándose específicamente en las redes bridge, e ilustrará cómo configurar una comunicación fluida entre servicios de contenedores utilizando tanto la CLI de Docker como Docker Compose.

Comprender la red de Docker es fundamental para construir aplicaciones contenerizadas robustas, escalables y mantenibles. Al ir más allá de la red bridge predeterminada, se obtiene un control más preciso sobre la topología de la red, la gestión de direcciones IP y la seguridad, lo que conduce a un comportamiento de la aplicación más predecible y fiable. Este artículo le proporcionará los conocimientos prácticos y los ejemplos necesarios para aprovechar las redes personalizadas en sus propios proyectos.

¿Por qué redes Docker personalizadas?

Docker proporciona varios drivers de red, cada uno adecuado para diferentes casos de uso. La red bridge predeterminada se crea automáticamente para los contenedores que no están explícitamente conectados a otra red. Si bien es conveniente, tiene limitaciones:

  • Aislamiento limitado: Los contenedores en la red bridge predeterminada pueden comunicarse entre sí utilizando sus direcciones IP, pero esto no siempre es intuitivo ni seguro. La resolución de nombres de contenedores no es compatible por defecto.
  • Gestión de direcciones IP: Las direcciones IP asignadas a los contenedores en la red bridge predeterminada pueden ser dinámicas y difíciles de gestionar.
  • Preocupaciones de escalabilidad: Para entornos de producción, a menudo se requiere una configuración de red más controlada y aislada.

Las redes bridge personalizadas ofrecen ventajas significativas:

  • Resolución DNS automática: Los contenedores en la misma red bridge personalizada pueden descubrirse y comunicarse entre sí utilizando sus nombres de contenedor (o nombres de servicio en Docker Compose). Esto cambia las reglas del juego para la comunicación entre servicios.
  • Aislamiento mejorado: Las redes personalizadas proporcionan un segmento de red dedicado para sus contenedores, mejorando la seguridad y evitando comunicaciones no deseadas con contenedores fuera de la red.
  • Mejor gestión de direcciones IP: Puede definir configuraciones de subred y gateway para sus redes personalizadas.
  • Flexibilidad: Agregue o quite fácilmente contenedores de las redes sin afectar a otros.

Creación y gestión de redes bridge personalizadas con la CLI de Docker

La interfaz de línea de comandos (CLI) de Docker le permite crear, inspeccionar y gestionar redes directamente. El comando docker network es su herramienta principal.

Creación de una red bridge personalizada

Para crear una nueva red bridge personalizada, utilice el comando docker network create:

docker network create mi-red-personalizada

Este comando crea una red llamada mi-red-personalizada utilizando el driver bridge (que es el predeterminado si no se especifica ningún driver).

Inspección de redes

Puede ver todas las redes de Docker y sus detalles con:

docker network ls
docker network inspect mi-red-personalizada

El comando inspect proporciona información detallada sobre la red, incluida su configuración, subredes y contenedores conectados.

Conexión de contenedores a una red

Cuando crea un nuevo contenedor, puede adjuntarlo a su red personalizada utilizando la bandera --network:

# Iniciar un contenedor de servidor web y conectarlo a mi-red-personalizada
docker run -d --name servidor-web --network mi-red-personalizada nginx

# Iniciar un contenedor de base de datos y conectarlo a la misma red
docker run -d --name base-datos --network mi-red-personalizada postgres

Ahora, los contenedores servidor-web y base-datos pueden comunicarse entre sí usando sus nombres. Por ejemplo, desde dentro del contenedor servidor-web, podría hacer ping base-datos o conectarse a la instancia de PostgreSQL usando postgres como nombre de host.

Conexión de contenedores existentes

También puede conectar un contenedor en ejecución a una red usando docker network connect:

# Asuma que tiene un contenedor en ejecución llamado 'otra-app'
docker network connect mi-red-personalizada otra-app

Desconexión de contenedores

Para eliminar un contenedor de una red:

docker network disconnect mi-red-personalizada otra-app

Eliminación de redes

Antes de poder eliminar una red, todos los contenedores conectados a ella deben detenerse y eliminarse, o desconectarse. Luego puede usar:

docker network rm mi-red-personalizada

Comunicación fluida con Docker Compose

Docker Compose es una herramienta invaluable para definir y ejecutar aplicaciones Docker multicontenedor. Permite gestionar los servicios, redes y volúmenes de su aplicación en un único archivo YAML. Definir redes personalizadas en Docker Compose es sencillo y muy recomendable para cualquier aplicación de múltiples servicios.

Definición de redes en docker-compose.yml

Para definir una red personalizada para sus servicios, utilice la clave networks en el nivel superior de su archivo docker-compose.yml. Luego, especifique la red para cada servicio en su respectiva definición de servicio.

Aquí hay un ejemplo de archivo docker-compose.yml:

version: '3.8'

services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
    networks:
      - red-app

  api:
    image: mi-imagen-api:latest
    networks:
      - red-app
    environment:
      - DB_HOST=db

  db:
    image: postgres:latest
    environment:
      POSTGRES_DB: midatabase
      POSTGRES_USER: user
      POSTGRES_PASSWORD: password
    networks:
      - red-app

networks:
  red-app:
    driver: bridge

En este ejemplo:

  • Definimos una sección networks de nivel superior.
  • red-app se define como una red bridge personalizada. Docker Compose creará esta red si no existe.
  • Los servicios web, api y db están todos explícitamente conectados a red-app usando la clave networks bajo cada servicio.

Cómo se comunican los servicios

Cuando ejecuta docker-compose up -d, Docker Compose crea la red red-app e inicia los contenedores, conectándolos a esta red. Fundamentalmente, Docker Compose configura automáticamente la resolución DNS dentro de esta red. Esto significa que:

  • El servicio web puede acceder al servicio db usando el nombre de host db.
  • El servicio api puede acceder al servicio db usando el nombre de host db.
  • El servicio web puede acceder al servicio api usando el nombre de host api.

Esta comunicación basada en nombres es mucho más robusta y legible que depender de direcciones IP.

Personalización de la configuración de red

Docker Compose permite una mayor personalización de sus redes, como la definición de subredes y gateways:

version: '3.8'

services:
  # ... servicios ...

networks:
  red-app:
    driver: bridge
    ipam:
      config:
        - subnet: 172.28.0.0/16
          gateway: 172.28.0.1

Esto proporciona un control explícito sobre el espacio de direcciones IP utilizado por su red.

Mejores prácticas para redes personalizadas

  • Una red por aplicación: Para la mayoría de las aplicaciones, definir una única red personalizada en Docker Compose simplifica la gestión y la comunicación.
  • Use nombres de red descriptivos: Elija nombres que indiquen claramente el propósito de la red (p. ej., red-mi-app, servicios-backend).
  • Conecte solo los servicios necesarios: Los servicios que necesitan comunicarse deben estar en la misma red. Evite conectar todos los servicios a una sola red si no necesitan interactuar.
  • Aproveche Docker Compose: Para cualquier cosa más allá de configuraciones simples de un solo contenedor, Docker Compose facilita enormemente la gestión de redes personalizadas y sus servicios asociados.
  • Evite la bridge predeterminada para producción: Utilice siempre redes bridge personalizadas u otros drivers de red (como overlay para Swarm/Kubernetes) para entornos de producción para garantizar un mejor aislamiento, control y resolución DNS.

Conclusión

Dominar las redes Docker personalizadas es esencial para construir aplicaciones contenerizadas sofisticadas e interconectadas. Al utilizar redes bridge personalizadas, ya sea a través de la CLI de Docker o, de manera más práctica, con Docker Compose, habilita un sólido descubrimiento de servicios basado en DNS y mejora el aislamiento de la red. Esto conduce a despliegues de contenedores más mantenibles, escalables y seguros. Adopte las redes personalizadas para desbloquear todo el potencial de Docker para sus aplicaciones de múltiples servicios.