Docker Cheatsheet
Docker Compose
Use this Docker reference while you build software engineering projects, review code for technical interview prep, or polish examples for a software engineer resume.
compose.yaml Structure
# compose.yaml (preferred filename; docker-compose.yml also accepted) name: myapp services: web: build: . # or build: { context: ., dockerfile: Dockerfile.prod } image: myapp:latest ports: - "3000:3000" environment: - NODE_ENV=production env_file: - .env depends_on: db: condition: service_healthy # wait for healthcheck restart: unless-stopped networks: - app volumes: - .:/app - /app/node_modules db: image: postgres:17-alpine environment: POSTGRES_DB: mydb POSTGRES_USER: user POSTGRES_PASSWORD: secret volumes: - pgdata:/var/lib/postgresql/data healthcheck: test: ["CMD-SHELL", "pg_isready -U user -d mydb"] interval: 10s timeout: 5s retries: 5 networks: - app volumes: pgdata: networks: app:
Core Commands
| Command | What it does |
|---|---|
docker compose up | Create and start all services |
docker compose up -d | Start in background |
docker compose up --build | Rebuild images before starting |
docker compose up --force-recreate | Recreate containers even if config unchanged |
docker compose down | Stop and remove containers + networks |
docker compose down -v | Also remove volumes |
docker compose down --rmi all | Also remove images |
docker compose stop | Stop without removing |
docker compose start | Start stopped services |
docker compose restart | Restart services |
docker compose ps | List service containers |
docker compose logs | Aggregate logs |
docker compose logs -f web | Follow logs for one service |
docker compose exec web bash | Shell into a running service |
docker compose run web node seed.js | One-off command in a new container |
docker compose build | Build/rebuild images |
docker compose pull | Pull latest images |
docker compose config | Validate and print merged config |
docker compose top | Running processes per service |
Scaling
docker compose up -d --scale worker=4 # run 4 replicas of worker
Profiles
services:
app:
image: myapp
debug:
image: busybox
profiles: [debug] # only starts with --profile debugdocker compose --profile debug up
Override Files
# docker-compose.override.yml is merged automatically
docker compose -f compose.yaml -f compose.prod.yaml up -d# compose.override.yml (dev overrides) services: web: build: target: dev volumes: - .:/app environment: - DEBUG=1
Depends_on Conditions
| Condition | Waits for |
|---|---|
service_started | Container to start (default) |
service_healthy | Healthcheck to pass |
service_completed_successfully | One-shot init container to exit 0 |
Environment Variable Substitution
services:
web:
image: myapp:${APP_VERSION:-latest} # falls back to "latest"
ports:
- "${PORT:-3000}:3000"Values in
.envin the project directory are loaded automatically. Secrets: prefersecrets:top-level key or a vault; never commit.env.
Secrets (Compose v2)
services:
web:
image: myapp
secrets:
- db_password
secrets:
db_password:
file: ./secrets/db_password.txt
# or: external: true (from Docker Swarm secrets)