Saltar a contenido

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

1
2
3
4
5
6
7
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

1
2
3
4
5
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