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
networksde nivel superior. red-appse define como una red bridge personalizada. Docker Compose creará esta red si no existe.- Los servicios
web,apiydbestán todos explícitamente conectados ared-appusando la clavenetworksbajo 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
webpuede acceder al serviciodbusando el nombre de hostdb. - El servicio
apipuede acceder al serviciodbusando el nombre de hostdb. - El servicio
webpuede acceder al servicioapiusando el nombre de hostapi.
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
overlaypara 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.