Contenido del curso
Arquitectura Basada en Microservicios
Automatización y Preparación del Entorno
Comunicación Asíncrona entre Servicios
Despliegue
Observabilidad
Docker Compose con cinco microservicios .NET
Resumen
Desplegar varios microservicios uno por uno se vuelve tedioso cuando tu arquitectura crece. Con Docker Compose puedes orquestar todos tus contenedores con un solo comando, aprovechando los Dockerfiles que ya generaste en cada proyecto. Esta guía te muestra cómo armar el archivo docker-compose.yml, configurar puertos y levantar cinco servicios .NET coordinados por Service Bus.
¿Qué hace Docker Compose en una arquitectura de microservicios?
Docker Compose lee un archivo YAML donde declaras todos los servicios de tu sistema y los despliega de forma simultánea como contenedores. En lugar de construir y correr cada imagen por separado, defines una vez la configuración y ejecutas docker compose up [02:30].
¿Qué es Docker Compose? Es una herramienta que orquesta múltiples contenedores Docker desde un solo archivo YAML. Tú declaras servicios, puertos y rutas, y Compose se encarga de construir las imágenes y levantarlas en conjunto.
En el ejemplo de la clase se levantan cinco servicios: agregar miembro, escoger edad, agregar adulto, agregar niño y obtener adultos. Tres de ellos se comunican vía Service Bus y dos exponen endpoints HTTP.
¿Cómo crear el archivo docker-compose.yml?
El archivo debe vivir dentro de la carpeta microservicios, no en una subcarpeta. Visual Studio lo reconoce automáticamente y muestra el ícono de la ballenita rosa al lado del nombre [00:55].
Dentro del archivo declaras una sección services con la lista de todo lo que quieres desplegar. Cada servicio incluye:
- La ruta a la carpeta donde vive el Dockerfile correspondiente.
- El nombre de la imagen que se va a generar, por ejemplo
add-member. - Los puertos de comunicación entre el host y el contenedor.
¿Por qué no puedes repetir el mismo puerto en dos servicios?
Cada puerto del host solo puede mapearse a un contenedor a la vez. Si agregar miembro usa el 8080, entonces obtener adultos debe usar otro distinto, por eso en la clase se cambia al 5000 [01:50]. Los servicios que se invocan vía Service Bus no necesitan exponer puertos porque no reciben tráfico HTTP directo.
¿Cuándo defino puertos en Docker Compose? Solo cuando el servicio expone un endpoint accesible desde fuera del contenedor. Los servicios internos que se comunican por mensajería como Service Bus no requieren mapeo de puertos.
¿Cómo levantar y verificar los servicios?
Desde la terminal, ubícate en la carpeta microservicios y ejecuta docker compose up. Compose construirá las imágenes y desplegará los contenedores asignando un color distinto a cada servicio en los logs, lo que facilita rastrear qué está pasando en cada uno [02:35].
Una vez arriba, prueba los endpoints desde tus archivos .http:
- Cambia la dirección de
localhost:5242o el puerto local por el puerto que asignaste en Compose, por ejemplo8080para agregar miembro o5000para obtener adultos. - Envía la solicitud y observa los logs coloreados en la terminal.
- Verifica el flujo completo: agregar miembro dispara agregar adulto o agregar niño según la edad calculada por escoger edad.
En la demostración, al registrar a Pepe nacido en 1999 se ve cómo el mensaje viaja por Service Bus y termina ejecutando agregar adulto [04:15]. Al registrar a Alejandra con fecha 2020, el flujo termina en agregar niño.
¿Qué ventajas obtienes al orquestar con Compose?
- Un solo comando levanta toda tu arquitectura.
- Los logs centralizados con colores te permiten depurar el flujo entre servicios.
- Puedes versionar el archivo YAML junto con tu código y replicar el entorno en cualquier máquina.
- Reduces errores humanos al eliminar pasos manuales repetidos.
Después de ver los cinco servicios funcionando de manera coordinada, el siguiente paso es completar los servicios de consulta restantes copiando y adaptando el código que ya tienes. Cuéntame en los comentarios qué puertos estás usando en tu propio docker-compose.yml y si te topaste con conflictos al mapearlos.