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

CommandWhat it does
docker compose upCreate and start all services
docker compose up -dStart in background
docker compose up --buildRebuild images before starting
docker compose up --force-recreateRecreate containers even if config unchanged
docker compose downStop and remove containers + networks
docker compose down -vAlso remove volumes
docker compose down --rmi allAlso remove images
docker compose stopStop without removing
docker compose startStart stopped services
docker compose restartRestart services
docker compose psList service containers
docker compose logsAggregate logs
docker compose logs -f webFollow logs for one service
docker compose exec web bashShell into a running service
docker compose run web node seed.jsOne-off command in a new container
docker compose buildBuild/rebuild images
docker compose pullPull latest images
docker compose configValidate and print merged config
docker compose topRunning 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 debug
docker 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

ConditionWaits for
service_startedContainer to start (default)
service_healthyHealthcheck to pass
service_completed_successfullyOne-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 .env in the project directory are loaded automatically. Secrets: prefer secrets: 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)