9. Docker Compose
Temas del programa: 4.2
Definir una aplicación con varios servicios
Cuando un contenedor no es suficiente
Section titled “Cuando un contenedor no es suficiente”Nuestra aplicación puede requerir
ReservaFIC
├── app├── db└── proxyCada servicio tiene una responsabilidad diferente
Necesitamos definir cómo se construye cómo se conecta y cómo se ejecuta cada componente
El problema de administrar cada servicio manualmente
Section titled “El problema de administrar cada servicio manualmente”docker network create reservaficdocker volume create datos_pgdocker run ...docker run ...docker run ...Una aplicación multicontenedor puede requerir muchas opciones de configuración
Si cada integrante del equipo ejecuta comandos diferentes el ambiente puede volverse difícil de reproducir
¿Qué es Docker Compose?
Section titled “¿Qué es Docker Compose?”Docker Compose permite definir y administrar aplicaciones multicontenedor mediante un archivo de configuración
El archivo describe servicios redes volúmenes y otras opciones de ejecución
compose.yaml │ ▼docker compose up │ ▼Aplicación multicontenedorUn primer archivo Compose
Section titled “Un primer archivo Compose”services: web: image: nginx:alpine ports: - "127.0.0.1:8080:80"Este archivo define un servicio llamado web
El servicio utiliza la imagen nginx:alpine y publica el puerto 80 del contenedor en el puerto 8080 del host
El puerto se publica solamente en la interfaz local
¿Cómo ejecutamos Compose?
Section titled “¿Cómo ejecutamos Compose?”En el directorio que contiene compose.yaml
docker compose up -dConsulta los servicios y contenedores
docker compose psConsulta los registros
docker compose logsSigue los registros
docker compose logs -f¿Cómo detenemos el proyecto?
Section titled “¿Cómo detenemos el proyecto?”docker compose downDetiene y elimina los recursos de contenedores y redes del proyecto que administra Compose según su configuración
Los volúmenes no se eliminan normalmente con este comando
docker compose down -vSolicita eliminar también los volúmenes asociados incluidos en el alcance del comando
Eliminar volúmenes puede provocar pérdida de datos
Un ejemplo con dos servicios
Section titled “Un ejemplo con dos servicios”services: web: image: nginx:alpine ports: - "127.0.0.1:8080:80"
app: image: php:8.3-cli command: ["php", "-v"]Este ejemplo demuestra la definición de dos servicios
No constituye todavía una aplicación web completa porque no conecta el servidor Nginx con una aplicación PHP funcional
¿Cómo se comunican los servicios?
Section titled “¿Cómo se comunican los servicios?”Compose crea una red para el proyecto de forma predeterminada
Red del proyecto
┌──────────┐ ┌──────────┐│ web │ │ app ││ │ │ │└──────────┘ └──────────┘Los servicios conectados a esa red pueden localizarse mediante el nombre del servicio cuando la configuración y el protocolo son correctos
El nombre de servicio no reemplaza la configuración de puertos ni hace que una aplicación escuche automáticamente
Una aplicación con base de datos
Section titled “Una aplicación con base de datos”services: db: image: postgres:16 environment: POSTGRES_DB: reservafic POSTGRES_USER: reservafic POSTGRES_PASSWORD: ejemplo-no-produccion volumes: - datos_pg:/var/lib/postgresql/data
volumes: datos_pg:Este ejemplo crea un servicio de PostgreSQL y un volumen nombrado para sus datos
La contraseña es ilustrativa y no debe utilizarse en producción
¿Qué significa cada parte?
Section titled “¿Qué significa cada parte?”services │ └── db │ ├── image ├── environment └── volumes
volumes │ └── datos_pgservices define los componentes de la aplicación
environment establece variables de entorno
volumes declara almacenamiento persistente administrado por Docker
Configuración sensible en Compose
Section titled “Configuración sensible en Compose”Las variables de entorno pueden servir para configurar una aplicación pero no deben considerarse un almacén de secretos de producción
Para un entorno real debemos evaluar
- Mecanismos de gestión de secretos
- Permisos de acceso
- Archivos excluidos de Git
- Rotación de credenciales
- Separación de ambientes
- Riesgos de exponer variables en registros o herramientas de diagnóstico
Un archivo .env tampoco debe publicarse con credenciales reales en un repositorio público
depends_on no significa que todo esté listo
Section titled “depends_on no significa que todo esté listo”Un servicio puede haberse iniciado aunque la aplicación todavía no esté lista para recibir conexiones
Contenedor DB iniciado │ ▼PostgreSQL inicializando │ ▼PostgreSQL listoEl orden de inicio y la disponibilidad del servicio son conceptos distintos
Las aplicaciones deben manejar errores temporales y reintentos cuando corresponda
Health checks
Section titled “Health checks”Un health check permite definir una comprobación de salud para un contenedor cuando la imagen o la configuración lo permiten
Servicio │ ▼Comprobación │ ├── no saludable │ └── saludableUn servicio puede estar ejecutándose y aun así no responder correctamente a las solicitudes
La comprobación debe evaluar una condición significativa para el servicio
Relación con el laboratorio
Section titled “Relación con el laboratorio”Este tema se practica en el Laboratorio 3 — Ambiente reproducible con Docker Compose.
Qué sigue
Section titled “Qué sigue”Continúa con 10. Seguridad de contenedores.

