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:
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
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"]
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: "*"
Containerize scraping pipelines? My Apify tools run in containers too.
Custom Docker setup? Email spinov001@gmail.com
Top comments (0)