Estructura Detallada de Docker Compose
Esquema General
Un archivo docker-compose.yml tiene la siguiente estructura jerárquica:
| version: "3.9" # Versión del formato de Docker Compose
services: # Definición de servicios/contenedores
servicio1: # Primer servicio
# configuración del servicio
servicio2: # Segundo servicio
# configuración del servicio
networks: # Definición de redes
red1: # Primera red
# configuración de la red
red2: # Segunda red
# configuración de la red
volumes: # Definición de volúmenes
volumen1: # Primer volumen
# configuración del volumen
volumen2: # Segundo volumen
# configuración del volumen
configs: # Definición de configuraciones (modo Swarm)
config1: # Primera configuración
# configuración
secrets: # Definición de secretos (modo Swarm)
secreto1: # Primer secreto
# configuración
|
Estructura Detallada de Servicios
| services:
servicio1:
# Especificación de imagen
image: nginx:latest # Imagen a utilizar
build: # O construir desde Dockerfile
context: ./dir # Contexto de construcción
dockerfile: Dockerfile.dev # Archivo Dockerfile
args: # Argumentos de construcción
buildno: 1
gitcommit: abc123
# Configuración de contenedor
container_name: mi-servicio # Nombre del contenedor
hostname: servicio1 # Hostname dentro del contenedor
domainname: ejemplo.com # Nombre de dominio
# Networking
ports: # Mapeo de puertos
- "80:80" # host:contenedor
- "443:443"
expose: # Puertos expuestos sin publicar
- "8080"
networks: # Redes a las que se conecta
- red1
- red2
# Almacenamiento
volumes: # Volúmenes y bind mounts
- /var/lib/mysql # Volumen anónimo
- db-data:/var/lib/mysql # Volumen nombrado
- ./config:/etc/nginx/conf.d:ro # Bind mount (solo lectura)
# Variables de entorno
environment: # Variables directas
- RACK_ENV=development
- SHOW=true
env_file: # Archivo de variables
- ./web-variables.env
# Dependencias
depends_on: # Dependencias de servicios
- db
- redis
# Políticas de reinicio y actualización
restart: always # Política de reinicio
deploy: # Configuración de despliegue
replicas: 3 # Número de réplicas
update_config: # Configuración de actualizaciones
parallelism: 2
delay: 10s
resources: # Límites de recursos
limits:
cpus: '0.50'
memory: 512M
reservations:
cpus: '0.25'
memory: 256M
# Configuración de salud
healthcheck: # Verificación de salud
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
# Configuración de usuario
user: postgres # Usuario para ejecutar el contenedor
working_dir: /app # Directorio de trabajo
# Comandos
entrypoint: /code/entrypoint.sh # Punto de entrada
command: ["php", "-d", "memory_limit=-1", "artisan", "serve"] # Comando
# DNS
dns: # Servidores DNS
- 8.8.8.8
- 8.8.4.4
dns_search: # Dominios de búsqueda DNS
- dc1.example.com
- dc2.example.com
# Configuración adicional
cap_add: # Agregar capacidades Linux
- ALL
cap_drop: # Quitar capacidades Linux
- NET_ADMIN
- SYS_ADMIN
# Logging
logging: # Configuración de logs
driver: "json-file"
options:
max-size: "200k"
max-file: "10"
|
Estructura Detallada de Redes
| networks:
red1:
driver: bridge # Driver de red (bridge, overlay, etc.)
driver_opts: # Opciones del driver
com.docker.network.bridge.name: mi-red
ipam: # Configuración IP
driver: default
config:
- subnet: 172.28.0.0/16
ip_range: 172.28.5.0/24
gateway: 172.28.5.254
internal: true # Red interna sin acceso a Internet
attachable: true # Permite adjuntar contenedores manualmente
enable_ipv6: true # Habilita IPv6
labels: # Etiquetas
com.ejemplo.descripcion: "Red frontend"
|
Estructura Detallada de Volúmenes
| volumes:
volumen1:
driver: local # Driver de volumen
driver_opts: # Opciones del driver
type: nfs
o: addr=10.40.0.199,rw
device: ":/docker/ejemplo"
external: false # Si el volumen es externo
labels: # Etiquetas
com.ejemplo.descripcion: "Datos de la base de datos"
|
Estructura Detallada de Configs
| configs:
config1:
file: ./configs/app.conf # Archivo de configuración
external: false # Si la configuración es externa
template: # Plantilla de configuración
source: ./template.conf
target: /etc/nginx/nginx.conf
|
Estructura Detallada de Secrets
| secrets:
secreto1:
file: ./secrets/api_key.txt # Archivo de secreto
external: true # Si el secreto es externo
name: production_api_key # Nombre externo del secreto
|
Ejemplo Completo Integrado
| version: "3.9"
services:
web:
image: nginx:latest
container_name: web-server
ports:
- "80:80"
networks:
- frontend
volumes:
- web-content:/usr/share/nginx/html
environment:
- NGINX_HOST=ejemplo.com
depends_on:
- api
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost"]
interval: 30s
deploy:
replicas: 2
resources:
limits:
cpus: '0.5'
memory: 512M
api:
build:
context: ./api
dockerfile: Dockerfile
networks:
- frontend
- backend
environment:
- DB_HOST=db
depends_on:
- db
secrets:
- db_password
db:
image: postgres:13
volumes:
- db-data:/var/lib/postgresql/data
networks:
- backend
environment:
- POSTGRES_DB=miapp
- POSTGRES_PASSWORD_FILE=/run/secrets/db_password
configs:
- source: db_config
target: /etc/postgresql/postgresql.conf
networks:
frontend:
driver: bridge
backend:
driver: bridge
internal: true
volumes:
web-content:
db-data:
driver: local
configs:
db_config:
file: ./configs/postgresql.conf
secrets:
db_password:
file: ./secrets/db_password.txt
|