DEV Community

Alex Spinov
Alex Spinov

Posted on

Docker Compose Has a Free API That Orchestrates Multi-Container Apps Effortlessly

Docker Compose lets you define and run multi-container applications with a single YAML file. Its v2 API adds watch mode, profiles, and GPU support.

Full-Stack App: One File

# docker-compose.yml
services:
  api:
    build: ./api
    ports: ["3000:3000"]
    environment:
      DATABASE_URL: postgres://user:pass@db:5432/scraping
      REDIS_URL: redis://cache:6379
    depends_on:
      db: { condition: service_healthy }
      cache: { condition: service_started }
    develop:
      watch:
        - action: sync
          path: ./api/src
          target: /app/src
        - action: rebuild
          path: ./api/package.json

  worker:
    build: ./worker
    environment:
      DATABASE_URL: postgres://user:pass@db:5432/scraping
      REDIS_URL: redis://cache:6379
    deploy:
      replicas: 3
    depends_on: [db, cache]

  db:
    image: postgres:16
    environment:
      POSTGRES_DB: scraping
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    volumes: ["pgdata:/var/lib/postgresql/data"]
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user"]
      interval: 5s
      timeout: 5s
      retries: 5

  cache:
    image: redis:7-alpine
    volumes: ["redisdata:/data"]

  grafana:
    image: grafana/grafana:latest
    ports: ["3001:3000"]
    volumes: ["./grafana/dashboards:/etc/grafana/provisioning/dashboards"]
    profiles: ["monitoring"]

volumes:
  pgdata:
  redisdata:
Enter fullscreen mode Exit fullscreen mode

Commands

# Start everything
docker compose up -d

# Watch mode (auto-sync on file changes)
docker compose watch

# Scale workers
docker compose up -d --scale worker=5

# Start with monitoring profile
docker compose --profile monitoring up -d

# View logs
docker compose logs -f api worker

# Execute command in container
docker compose exec db psql -U user scraping

# Rebuild specific service
docker compose build api --no-cache
Enter fullscreen mode Exit fullscreen mode

Multi-Stage Builds

# Dockerfile
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

FROM node:20-alpine AS runner
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY package.json ./
EXPOSE 3000
CMD ["node", "dist/index.js"]
Enter fullscreen mode Exit fullscreen mode

Override Files

# docker-compose.override.yml (auto-loaded in dev)
services:
  api:
    build:
      target: builder
    volumes: ["./api/src:/app/src"]
    command: npm run dev
    environment:
      NODE_ENV: development
      DEBUG: "*"
Enter fullscreen mode Exit fullscreen mode

Containerize scraping pipelines? My Apify tools run in containers too.

Custom Docker setup? Email spinov001@gmail.com

Top comments (0)