* Práctica 2.6: Temperaturas con Docker Compose
Relación 2.6¶
Descripción¶
Actividad: Despliegue de Temperaturas con Docker Compose
En esta práctica retomarás la aplicación de microservicios Temperaturas de la Práctica 2.2, pero esta vez la desplegarás utilizando Docker Compose. Verás cómo la gestión de aplicaciones sin estado y microservicios se simplifica enormemente con una configuración declarativa.
Objetivo general¶
Aprender a:
- Desplegar arquitecturas de microservicios con Docker Compose.
- Gestionar dependencias entre servicios.
- Configurar comunicación entre microservicios de forma declarativa.
- Comparar la orquestación de aplicaciones con y sin estado.
- Entender las ventajas de Docker Compose en arquitecturas de microservicios.
Contexto de trabajo¶
Recordatorio de la aplicación Temperaturas:
- Frontend: Interfaz web en Python (puerto 3000/tcp) - imagen
iesgn/temperaturas_frontend - Backend: API REST en Python (puerto 5000/tcp) - imagen
iesgn/temperaturas_backend - Tipo: Aplicación sin estado (stateless)
- Comunicación: El frontend consulta el backend vía HTTP
Diferencias con Guestbook:
- No requiere persistencia de datos
- Arquitectura de microservicios más clara
- Uso de dependencias explícitas entre servicios
🔹 Parte 1: Creación del archivo docker-compose.yml¶
Tarea 1.1: Estructura básica¶
-
Crea un directorio para esta práctica:
~/temperaturas_compose. -
Crea el archivo
docker-compose.ymlcon la siguiente estructura:
version: '3.1'
services:
frontend:
container_name: temperaturas-frontend
image: iesgn/temperaturas_frontend
restart: always
ports:
- 8081:3000
environment:
TEMP_SERVER: temperaturas-backend:5000
depends_on:
- backend
backend:
container_name: temperaturas-backend
image: iesgn/temperaturas_backend
restart: always
-
Analiza la estructura del archivo:
- ¿Por qué el frontend tiene
depends_on: - backend? - ¿Qué indica la variable
TEMP_SERVER? - ¿Por qué el backend no expone puertos al host?
- ¿Por qué el frontend tiene
Tarea 1.2: Comprensión de dependencias¶
-
Investiga qué hace la directiva
depends_on:- ¿Garantiza que el backend esté completamente iniciado antes que el frontend?
- ¿Solo controla el orden de inicio?
- ¿Qué limitaciones tiene?
-
Modifica el archivo para usar el nombre del servicio en lugar del contenedor:
-
Verifica que ambas configuraciones funcionan correctamente.
🔹 Parte 2: Despliegue y gestión¶
Tarea 2.1: Despliegue del escenario¶
-
Despliega la aplicación con Docker Compose.
-
Observa el orden en que se crean los servicios. ¿Se crea primero el backend?
-
Verifica los contenedores en ejecución.
-
Accede a la aplicación (http://localhost:8081).
-
Realiza búsquedas de varios municipios.
Tarea 2.2: Análisis de logs¶
-
Visualiza los logs de ambos servicios simultáneamente.
-
Visualiza solo los logs del frontend.
-
Visualiza solo los logs del backend.
-
En los logs del frontend, busca las peticiones HTTP que realiza al backend.
-
En los logs del backend, identifica las respuestas que envía.
Tarea 2.3: Pruebas de resiliencia¶
-
Detén solo el servicio backend.
-
Intenta acceder a la aplicación. ¿Qué sucede?
-
Observa los logs del frontend. ¿Qué errores aparecen?
-
Arranca nuevamente el backend.
-
Verifica que la aplicación vuelve a funcionar sin necesidad de reiniciar el frontend.
🔹 Parte 3: Escalado de microservicios¶
Tarea 3.1: Escalado del backend¶
-
Escala el servicio backend a 3 instancias.
-
Verifica que las tres instancias están en ejecución.
-
Realiza varias búsquedas en la aplicación.
-
¿Las peticiones se distribuyen entre las instancias? ¿Por qué?
Tarea 3.2: Escalado del frontend¶
-
Intenta escalar el frontend a 2 instancias.
-
¿Qué problema aparece? (conflicto de puertos)
-
Modifica el
docker-compose.ymlpara permitir el escalado del frontend:
frontend:
image: iesgn/temperaturas_frontend
restart: always
ports:
- "8081-8083:3000"
environment:
TEMP_SERVER: backend:5000
depends_on:
- backend
- Escala el frontend y verifica que funciona.
🔹 Parte 4: Configuración avanzada¶
Tarea 4.1: Límites de recursos¶
- Añade límites de recursos a los servicios:
services:
frontend:
# ... resto de configuración
deploy:
resources:
limits:
cpus: '0.5'
memory: 128M
reservations:
cpus: '0.25'
memory: 64M
backend:
# ... resto de configuración
deploy:
resources:
limits:
cpus: '0.5'
memory: 128M
replicas: 2
- Despliega y verifica el consumo de recursos.
Tarea 4.2: Healthchecks¶
- Añade healthchecks a los servicios:
backend:
image: iesgn/temperaturas_backend
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:5000"]
interval: 30s
timeout: 3s
retries: 3
start_period: 40s
- Verifica el estado de salud de los servicios.
Tarea 4.3: Variables de entorno desde archivo¶
- Crea un archivo
.env:
- Modifica el
docker-compose.yml:
services:
frontend:
ports:
- "${FRONTEND_PORT}:3000"
environment:
TEMP_SERVER: ${BACKEND_HOST}:${BACKEND_PORT}
- Verifica que funciona con las variables del archivo
.env.
🔹 Parte 5: Análisis y documentación¶
Tarea 5.1: Preguntas de análisis¶
Responde en tu documentación:
-
Aplicaciones sin estado:
- ¿Por qué es más fácil escalar aplicaciones sin estado?
- ¿Qué ventajas tiene no necesitar volúmenes?
- Compara con Guestbook (que sí tiene estado).
-
Dependencias entre servicios:
- ¿Qué diferencia hay entre
depends_onylinks? - ¿
depends_ongarantiza que el servicio esté listo para recibir peticiones? - ¿Cómo se podría mejorar esto con healthchecks?
- ¿Qué diferencia hay entre
-
Arquitectura de microservicios:
- ¿Qué ventajas tiene separar frontend y backend?
- ¿Cómo facilita Docker Compose el desarrollo de microservicios?
- ¿Qué pasa si el backend falla? ¿Y si el frontend falla?
-
Escalado:
- ¿Por qué es más fácil escalar el backend que el frontend?
- ¿Cómo se distribuirían las peticiones con múltiples backends?
- ¿Necesitarías un balanceador de carga?
-
Comparación con práctica anterior:
- ¿Qué comandos de la Práctica 2.2 sustituye Docker Compose?
- ¿Es más fácil gestionar esta aplicación con Compose?
- ¿Qué ventajas adicionales obtienes?
Tarea 5.2: Tabla comparativa¶
Crea una tabla comparando:
| Aspecto | Temperaturas manual | Temperaturas Compose |
|---|---|---|
| Comandos para desplegar | ||
| Gestión de red | ||
| Variables de entorno | ||
| Escalado | ||
| Orden de inicio | ||
| Logs |
Entregables¶
-
Documentación en formato Markdown o PDF con:
- Archivo
docker-compose.ymlcompleto y comentado - Todos los comandos Docker Compose utilizados
- Capturas de pantalla:
- Aplicación funcionando
- Búsquedas de municipios
- Servicios en ejecución
- Logs de ambos microservicios
- Escalado de servicios
- Healthchecks
- Respuestas a las preguntas de análisis
- Tabla comparativa
- Archivo
-
Archivos de configuración:
docker-compose.ymlbásicodocker-compose.ymlavanzado (con healthchecks, límites, etc.).env(si lo utilizas)
Evaluación¶
Se evaluará:
- Correcta configuración del archivo Compose.
- Comprensión de dependencias entre servicios.
- Análisis de aplicaciones sin estado.
- Práctica con escalado de microservicios.
- Comparación crítica con gestión manual.
Condiciones de entrega¶
Las publicadas en la plataforma Moodle del curso.
Recursos de apoyo¶
- Documentación oficial de Docker Compose: https://docs.docker.com/compose/
- Depends_on: https://docs.docker.com/compose/compose-file/05-services/#depends_on
- Healthchecks: https://docs.docker.com/compose/compose-file/05-services/#healthcheck
- Escalado: https://docs.docker.com/compose/reference/scale/
- Repositorio con ejemplos: https://github.com/josedom24/curso_docker_ies