Docker Cheatsheet

Quick reference for the most commonly used Docker commands.

Container Lifecycle

# Run container
docker run nginx
docker run -d nginx          # Detached
docker run -it ubuntu bash   # Interactive
docker run --name web nginx  # Named
docker run --rm nginx        # Auto-remove

# Start / Stop / Restart
docker start <id>
docker stop <id>
docker restart <id>
docker kill <id>    # Force stop

# Remove container
docker rm <id>
docker rm -f <id>   # Force remove running
docker container prune      # Remove all stopped

Inspect & Debug

# List containers
docker ps           # Running
docker ps -a        # All

# Logs
docker logs <id>
docker logs -f <id>          # Follow
docker logs --tail 100 <id>  # Last 100 lines

# Execute commands
docker exec -it <id> bash
docker exec <id> ls /app

# Inspect
docker inspect <id>
docker stats                 # Live resource usage
docker top <id>             # Running processes

Images

# List images
docker images
docker image ls

# Pull / Push
docker pull nginx:alpine
docker push myrepo/myapp:v1

# Build
docker build -t myapp:latest .
docker build -t myapp:v1 -f Dockerfile.prod .

# Tag
docker tag myapp:latest myrepo/myapp:v1

# Remove images
docker rmi <image>
docker image prune        # Dangling images
docker image prune -a     # All unused

Networking

# Run with port mapping
docker run -p 8080:80 nginx       # host:container
docker run -p 127.0.0.1:8080:80 nginx

# Network management
docker network ls
docker network create mynet
docker network inspect mynet

# Connect / disconnect
docker network connect mynet <id>
docker network disconnect mynet <id>

# Run in network
docker run --network mynet nginx

# DNS — containers find each other by name
docker run --network mynet --name web nginx
docker run --network mynet --name app myapp

Volumes

# Named volumes
docker volume create mydata
docker volume ls
docker volume inspect mydata
docker volume rm mydata
docker volume prune

# Run with volume
docker run -v mydata:/app/data nginx
docker run -v mydata:/app/data:ro nginx  # Read-only

# Bind mount (host directory)
docker run -v /host/path:/container/path nginx
docker run -v $(pwd):/app nginx

# tmpfs (in-memory)
docker run --tmpfs /tmp nginx

Run Options

# Environment variables
docker run -e NODE_ENV=production nginx
docker run --env-file .env nginx

# Resource limits
docker run --memory 512m nginx
docker run --cpus 0.5 nginx

# Restart policy
docker run --restart unless-stopped nginx
docker run --restart on-failure:3 nginx

# User
docker run --user 1000:1000 nginx

# Read-only filesystem
docker run --read-only nginx

# Hostname
docker run --hostname mycontainer nginx

Docker Compose

# Start services
docker compose up -d              # Detached
docker compose up --build         # Rebuild images
docker compose up -d --scale web=3  # Scale

# Stop services
docker compose down               # Stop and remove
docker compose down -v            # Also remove volumes
docker compose stop               # Stop only

# Status
docker compose ps
docker compose logs
docker compose logs -f web        # Follow specific service
docker compose top

# Run one-off commands
docker compose exec web bash
docker compose run --rm web pytest
docker compose run --rm web python manage.py migrate

docker-compose.yml — Full Example

version: "3.9"

services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
      target: production
    image: myapp:latest
    container_name: myapp-web
    ports:
      - "8080:8080"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgresql://user:pass@db:5432/myapp
    env_file:
      - .env
    depends_on:
      db:
        condition: service_healthy
      redis:
        condition: service_started
    volumes:
      - uploads:/app/uploads
    networks:
      - frontend
      - backend
    restart: unless-stopped
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
      interval: 30s
      timeout: 10s
      retries: 3
      start_period: 10s
    deploy:
      resources:
        limits:
          memory: 512m
          cpus: "0.5"

  db:
    image: postgres:16-alpine
    environment:
      POSTGRES_DB: myapp
      POSTGRES_USER: user
      POSTGRES_PASSWORD: pass
    volumes:
      - postgres_data:/var/lib/postgresql/data
    networks:
      - backend
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user -d myapp"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    image: redis:7-alpine
    volumes:
      - redis_data:/data
    networks:
      - backend
    command: redis-server --appendonly yes

  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: [web]
    networks:
      - frontend

volumes:
  postgres_data:
  redis_data:
  uploads:

networks:
  frontend:
  backend:
    internal: true    # No external access

Dockerfile Reference

Common Instructions

FROM ubuntu:22.04
LABEL maintainer="[email protected]"

# Environment
ENV APP_HOME=/app
ENV PORT=8080
ARG BUILD_DATE

# Working directory
WORKDIR /app

# Copy files
COPY . .
COPY src/ ./src/
ADD archive.tar.gz /app/    # Extracts automatically

# Run commands (creates layer)
RUN apt-get update \
    && apt-get install -y curl \
    && rm -rf /var/lib/apt/lists/*

# User
RUN useradd -r appuser
USER appuser

# Expose port (documentation)
EXPOSE 8080

# Health check
HEALTHCHECK --interval=30s CMD curl -f http://localhost:8080/health

# Entry point
ENTRYPOINT ["python"]
CMD ["-m", "uvicorn", "main:app"]

Multi-stage Build

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

# Production stage
FROM node:20-alpine AS production
WORKDIR /app

# Non-root user
RUN addgroup -S app && adduser -S app -G app

# Copy only build output
COPY --from=builder --chown=app:app /build/dist ./dist
COPY --from=builder --chown=app:app /build/node_modules ./node_modules

USER app
EXPOSE 3000
CMD ["node", "dist/server.js"]

Cleanup & Maintenance

# System-wide cleanup
docker system df                  # Show disk usage
docker system prune               # Remove all unused resources
docker system prune -a            # Also remove unused images
docker system prune -a --volumes  # Also remove volumes (CAREFUL!)

# Specific cleanup
docker container prune    # Stopped containers
docker image prune -a     # Unused images
docker volume prune       # Unused volumes
docker network prune      # Unused networks

# Export / Import images (for air-gapped environments)
docker save myapp:v1 | gzip > myapp-v1.tar.gz
docker load < myapp-v1.tar.gz

# Copy files to/from container
docker cp mycontainer:/app/log.txt ./log.txt
docker cp ./config.json mycontainer:/app/config.json
💡 Tips: Use .dockerignore to exclude files from build context (similar to .gitignore). Add node_modules/, .git/, *.log, .env to keep images small and builds fast.

Back to Documents  |  kubectl Cheatsheet