#!/bin/bash
# Docker Compose commands
# Start all services
docker compose up -d
# Start with build
docker compose up -d --build
# Start specific services
docker compose up -d app db
# Start with profiles
docker compose --profile workers up -d
# View logs
docker compose logs -f app
docker compose logs --tail=100 db
# Scale services
docker compose up -d --scale worker=3
# Execute commands in running service
docker compose exec app /bin/sh
docker compose exec db psql -U postgres myapp
# Stop services
docker compose stop
docker compose down # Stop and remove containers
docker compose down -v # Also remove volumes
docker compose down --rmi all # Also remove images
# Check status
docker compose ps
docker compose top
# Override for development
# docker-compose.override.yml is auto-loaded
docker compose -f docker-compose.yml -f docker-compose.prod.yml up -d
version: '3.8'
services:
app:
build:
context: .
dockerfile: Dockerfile
target: production
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgres://postgres:secret@db:5432/myapp
- REDIS_URL=redis://redis:6379
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
volumes:
- uploads:/app/uploads
networks:
- backend
restart: unless-stopped
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
reservations:
cpus: '0.5'
memory: 256M
db:
image: postgres:16-alpine
environment:
POSTGRES_DB: myapp
POSTGRES_USER: postgres
POSTGRES_PASSWORD: secret
volumes:
- postgres_data:/var/lib/postgresql/data
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
ports:
- "5432:5432"
networks:
- backend
healthcheck:
test: ["CMD-SHELL", "pg_isready -U postgres"]
interval: 10s
timeout: 5s
retries: 5
redis:
image: redis:7-alpine
command: redis-server --appendonly yes --maxmemory 256mb
volumes:
- redis_data:/data
ports:
- "6379:6379"
networks:
- backend
healthcheck:
test: ["CMD", "redis-cli", "ping"]
interval: 10s
timeout: 5s
retries: 5
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
volumes:
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- ./nginx/certs:/etc/nginx/certs:ro
depends_on:
- app
networks:
- backend
restart: unless-stopped
worker:
build:
context: .
dockerfile: Dockerfile
target: production
command: node dist/worker.js
environment:
- NODE_ENV=production
- DATABASE_URL=postgres://postgres:secret@db:5432/myapp
- REDIS_URL=redis://redis:6379
depends_on:
db:
condition: service_healthy
redis:
condition: service_healthy
networks:
- backend
restart: unless-stopped
profiles:
- workers
volumes:
postgres_data:
uploads:
redis_data:
networks:
backend:
driver: bridge
Docker Compose orchestrates multi-container applications with a single YAML file. The docker-compose.yml defines services, networks, and volumes declaratively. Each service maps to a container with its own image, ports, environment, and dependencies. The depends_on directive controls startup order. Named volumes persist data across container restarts. Custom networks isolate service communication. Environment variables can be loaded from .env files. The build key builds images from local Dockerfiles. Health checks ensure services are ready before dependents start. Use docker compose up -d to start all services, docker compose down to stop them. Profiles group optional services. Compose is essential for local development environments that mirror production topology.