AI Skill Library

Docker Compose Patterns

Multi-service apps, volumes, networks, health checks, profiles, override files.

dockerdevopsbackend
# Docker Compose Patterns

## Full-stack example
```yaml
# compose.yml
services:
  db:
    image: postgres:16-alpine
    restart: unless-stopped
    environment:
      POSTGRES_USER: app
      POSTGRES_PASSWORD: secret
      POSTGRES_DB: appdb
    volumes:
      - pgdata:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U app"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    restart: unless-stopped

  api:
    build: ./api
    restart: unless-stopped
    ports: ["3000:3000"]
    environment:
      DATABASE_URL: postgres://app:secret@db/appdb
      REDIS_URL: redis://redis:6379
    depends_on:
      db:
        condition: service_healthy
    develop:
      watch:
        - action: sync
          path: ./api/src
          target: /app/src

  web:
    build: ./web
    ports: ["80:80"]
    depends_on: [api]

volumes:
  pgdata:

networks:
  default:
    name: appnet
```

## Override files
```yaml
# compose.override.yml (auto-merged in dev)
services:
  api:
    environment:
      NODE_ENV: development
    volumes: ["./api:/app"]  # bind mount for hot reload

# compose.prod.yml
services:
  api:
    image: registry.example.com/api:${TAG}
    deploy:
      replicas: 3
      resources:
        limits: { cpus: '0.5', memory: 512M }
```
```bash
docker compose -f compose.yml -f compose.prod.yml up -d
```

## Profiles (optional services)
```yaml
services:
  mailhog:
    image: mailhog/mailhog
    profiles: [dev]
  prometheus:
    image: prom/prometheus
    profiles: [monitoring]
```
```bash
docker compose --profile dev up
```

## Useful commands
```bash
docker compose up -d --build     # build & start detached
docker compose logs -f api       # stream logs
docker compose exec api sh       # shell into running container
docker compose ps
docker compose down -v           # stop + remove volumes
docker compose restart api
docker compose scale api=3       # or use replicas in yaml
```

## Secrets (production)
```yaml
services:
  api:
    secrets: [db_password]
secrets:
  db_password:
    file: ./secrets/db_password.txt
    # or: external: true  (Docker Swarm / Kubernetes secret)
```

API: /api/skills/docker-compose-patterns