Mira la lección en vídeo
Accede al vídeo completo de esta lección y a más contenido exclusivo con el Plan Plus.
Desbloquear Plan PlusEstructura general compose.yaml
Docker Compose utiliza un archivo YAML denominado compose.yaml
(o alternativamente docker-compose.yaml
) para definir y orquestar múltiples contenedores como una aplicación completa. Este archivo sigue una estructura jerárquica específica que permite describir todos los componentes necesarios de manera declarativa.
Anatomía del archivo compose.yaml
La estructura de un archivo Compose se organiza en secciones de nivel superior (top-level) que definen los diferentes recursos de la aplicación:
# Ejemplo básico de estructura
services:
web:
image: nginx:1.29
ports:
- "80:80"
database:
image: mysql:9
environment:
MYSQL_ROOT_PASSWORD: secret
volumes:
data_volume:
networks:
app_network:
Secciones top-level principales
Docker Compose reconoce tres secciones principales en el nivel superior del archivo:
services
: Define los contenedores que componen la aplicaciónvolumes
: Declara volúmenes nombrados para persistencia de datosnetworks
: Especifica redes personalizadas para comunicación entre servicios
La sección services
La sección services
es el corazón del archivo Compose y donde se definen todos los contenedores de la aplicación. Cada servicio representa un contenedor con su configuración específica:
services:
frontend:
image: node:24
ports:
- "3000:3000"
backend:
image: python:3.13
ports:
- "8000:8000"
cache:
image: redis:latest
Cada clave bajo services (como frontend
, backend
, cache
) define un servicio individual. El nombre del servicio se convierte automáticamente en el hostname que otros servicios pueden utilizar para comunicarse entre sí.
Convenciones de nomenclatura
Docker Compose aplica reglas de nomenclatura consistentes para facilitar la gestión:
- Nombres de servicios: Utilizan el formato
snake_case
y se convierten en hostnames DNS - Prefijo de proyecto: Todos los recursos creados incluyen el nombre del directorio como prefijo
- Sufijos automáticos: Los contenedores reciben sufijos numéricos para evitar conflictos
services:
web_server: # Se convierte en hostname 'web_server'
image: nginx:1.29
api_service: # Se convierte en hostname 'api_service'
image: node:24
Validación y sintaxis YAML
El archivo debe seguir sintaxis YAML válida con especial atención a:
- Indentación: Utilizar espacios (no tabs) de forma consistente
- Estructura jerárquica: Mantener la anidación correcta de elementos
- Comillas: Usar comillas para valores que contienen caracteres especiales
services:
web:
image: "nginx:1.29" # Comillas recomendadas para tags
container_name: "my-web-server"
restart: always
Versionado y compatibilidad
Los archivos Compose modernos no requieren especificar una versión explícita. Docker Compose v2 detecta automáticamente la sintaxis y aplica las características más recientes disponibles:
# ❌ Ya no es necesario especificar version
# version: '3.8'
# ✅ Sintaxis moderna sin version
services:
app:
image: python:3.13
Esta estructura proporciona la base fundamental sobre la cual se construyen aplicaciones multi-contenedor, estableciendo un marco organizativo claro que facilita tanto el desarrollo como el mantenimiento de aplicaciones complejas.
Estructura de un servicio
Guarda tu progreso
Inicia sesión para no perder tu progreso y accede a miles de tutoriales, ejercicios prácticos y nuestro asistente de IA.
Más de 25.000 desarrolladores ya confían en CertiDevs
Un servicio en Docker Compose representa la configuración completa de un contenedor específico dentro de la aplicación. Cada servicio se define mediante un conjunto de propiedades clave que determinan cómo se ejecutará el contenedor correspondiente.
Configuración básica de imagen
Todo servicio debe especificar la imagen base que utilizará para crear el contenedor. Esta es la configuración más fundamental:
services:
web:
image: nginx:1.29
database:
image: mysql:9
api:
image: python:3.13
La propiedad image
acepta cualquier imagen válida disponible en registries públicos o privados, siguiendo la sintaxis estándar de Docker con formato nombre:tag
.
Exposición de puertos
Los servicios pueden exponer puertos para permitir comunicación desde el host o entre contenedores:
services:
frontend:
image: node:24
ports:
- "3000:3000" # host:contenedor
- "3001:3001"
backend:
image: python:3.13
ports:
- "8000:8000"
- "127.0.0.1:8001:8001" # Bind específico a localhost
La sintaxis "puerto_host:puerto_contenedor"
mapea puertos del sistema host hacia puertos internos del contenedor, facilitando el acceso externo a los servicios.
Configuración de nombres de contenedor
Por defecto, Docker Compose genera nombres automáticos para los contenedores, pero se pueden especificar nombres personalizados:
services:
web:
image: nginx:1.29
container_name: my-nginx-server
cache:
image: redis:latest
container_name: app-redis-cache
El uso de container_name
proporciona nombres predecibles que facilitan la administración y el debugging de contenedores individuales.
Políticas de reinicio
Los servicios pueden configurar comportamientos de reinicio automático ante fallos o paradas del sistema:
services:
database:
image: postgres:17
restart: always
web:
image: nginx:1.29
restart: unless-stopped
worker:
image: python:3.13
restart: on-failure
Las políticas disponibles incluyen:
no
: No reinicia automáticamente (por defecto)always
: Reinicia siempre, incluso tras reboot del hostunless-stopped
: Reinicia excepto cuando se detiene manualmenteon-failure
: Reinicia solo ante códigos de salida de error
Verificaciones de salud
Docker Compose permite definir health checks para monitorear el estado de los servicios:
services:
web:
image: nginx:1.29
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
database:
image: mysql:9
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
interval: 20s
timeout: 5s
retries: 3
Los parámetros de healthcheck controlan:
test
: Comando de verificación a ejecutarinterval
: Frecuencia entre verificacionestimeout
: Tiempo límite por verificaciónretries
: Intentos antes de marcar como no saludablestart_period
: Período de gracia inicial
Configuración avanzada de servicios
Los servicios admiten configuraciones adicionales para casos específicos:
services:
app:
image: python:3.13
working_dir: /app
user: "1000:1000"
stdin_open: true # Equivale a -i en docker run
tty: true # Equivale a -t en docker run
database:
image: postgres:17
shm_size: "256mb"
ulimits:
nofile:
soft: 65536
hard: 65536
Combinación de opciones de servicio
Un servicio completo puede combinar múltiples configuraciones para crear un contenedor completamente especificado:
services:
api_server:
image: node:24
container_name: main-api
ports:
- "8080:8080"
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 5s
retries: 3
working_dir: /usr/src/app
user: "node:node"
Esta estructura de configuración por servicio proporciona flexibilidad completa para definir el comportamiento específico de cada contenedor, manteniendo la simplicidad declarativa que caracteriza a Docker Compose y facilitando la gestión de aplicaciones multi-contenedor complejas.
Aprendizajes de esta lección de Docker
- Comprender la estructura general y las secciones principales del archivo compose.yaml.
- Definir y configurar servicios con imágenes, puertos, nombres y políticas de reinicio.
- Aplicar convenciones de nomenclatura y buenas prácticas en archivos YAML para Docker Compose.
- Implementar health checks para monitorizar el estado de los servicios.
- Configurar opciones avanzadas para personalizar el comportamiento de los contenedores.
Completa este curso de Docker y certifícate
Únete a nuestra plataforma de cursos de programación y accede a miles de tutoriales, ejercicios prácticos, proyectos reales y nuestro asistente de IA personalizado para acelerar tu aprendizaje.
Asistente IA
Resuelve dudas al instante
Ejercicios
Practica con proyectos reales
Certificados
Valida tus conocimientos
Más de 25.000 desarrolladores ya se han certificado con CertiDevs