Quick Reference

Cheatsheets

Practical command references for Linux, networking, servers, containers, databases, and more.

Cheatsheet#docker

Docker Cheatsheet

Docker is an open-source platform for developing, shipping, and running applications inside lightweight, isolated environments called containers.


1. Docker Core Engine & CLI

Installation

# Debian / Ubuntu (official Docker CE repository)
sudo apt install ca-certificates curl gnupg
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu $(. /etc/os-release && echo $VERSION_CODENAME) stable" | sudo tee /etc/apt/sources.list.d/docker.list
sudo apt update && sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
 
# RHEL / CentOS / Fedora
sudo dnf install dnf-plugins-core
sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf install docker-ce docker-ce-cli containerd.io docker-compose-plugin
 
# Arch Linux
sudo pacman -S docker docker-compose
 
# Add current user to docker group (avoids needing sudo)
sudo usermod -aG docker $USER
# Log out and log back in for group membership to take effect

Service Management

sudo systemctl enable --now docker     # Start Docker daemon and enable on boot
sudo systemctl status docker           # Check Docker daemon status
sudo systemctl restart docker          # Restart Docker daemon

Container Management

docker ps                              # List running containers
docker ps -a                           # List all containers (including stopped)
docker ps -q                           # List container IDs only
 
# Running Containers
docker run -d --name web nginx         # Run in background (detached mode)
docker run -it ubuntu bash             # Run interactively with a TTY shell
docker run --rm alpine echo "hello"    # Run and auto-remove when finished
docker run -d --restart always nginx   # Always restart container on exit/reboot
 
# Lifecycle Control
docker stop web                        # Stop container gracefully (SIGTERM)
docker start web                       # Start a stopped container
docker restart web                     # Restart a container
docker pause web                       # Pause processes in container
docker unpause web                     # Unpause container
docker kill web                        # Force stop container immediately (SIGKILL)
 
# Deleting Containers
docker rm web                          # Delete a stopped container
docker rm -f web                       # Force delete a running container
docker rm $(docker ps -a -q)           # Remove all stopped containers
docker rename old_name new_name        # Rename a container

Image Management

docker images                          # List local images
docker pull ubuntu:latest              # Download an image from Docker Hub
docker pull nginx:1.25-alpine          # Download a specific version tag
docker rmi ubuntu:latest               # Remove local image
docker rmi -f ubuntu:latest            # Force remove image
docker build -t myapp:1.0 .            # Build image from Dockerfile in current dir
docker build -t myapp:1.0 -f App.df .  # Build using custom Dockerfile name
docker history myapp:1.0               # Show layer history of an image
docker inspect myapp:1.0               # View detailed JSON metadata

Port Forwarding and Volumes

# Port Mapping (-p host:container)
docker run -d -p 8080:80 nginx         # Map host port 8080 to container port 80
docker run -d -p 127.0.0.1:8080:80 nginx # Bind only to localhost on host
 
# Bind Mounts (-v host_path:container_path)
docker run -d -v /var/www:/usr/share/nginx/html nginx
 
# Named Volumes
docker volume create my_data           # Create a named volume
docker volume ls                       # List all volumes
docker volume inspect my_data          # Show volume details on host filesystem
docker volume rm my_data               # Delete a volume
docker run -d -v my_data:/var/lib/mysql mysql
docker run -d -v /host/config:/etc/app:ro myapp # Read-only mount (:ro)

Environment Variables

# Set inline environment variables (-e KEY=VALUE)
docker run -d -e MYSQL_ROOT_PASSWORD=secret -e MYSQL_DATABASE=mydb mysql
 
# Load environment variables from file (--env-file)
docker run -d --env-file .env myapp

Logs and Debugging

docker logs web                        # View container logs
docker logs -f web                     # Follow log output in real-time
docker logs --tail 100 web             # Show last 100 lines of logs
docker logs --since 30m web            # Show logs from last 30 minutes
docker exec -it web sh                 # Execute shell inside running container
docker exec -it web bash               # Execute bash inside container
docker inspect web                     # View full container configuration JSON
docker top web                         # Display running processes of container
docker stats                           # Display live stream of container resource usage
docker cp web:/app/log.txt ./log.txt   # Copy file from container to host
docker cp ./config.json web:/app/      # Copy file from host into container

Docker Networking

docker network ls                      # List networks
docker network create my_network       # Create a custom bridge network
docker network create --driver overlay my_overlay # Create overlay network
docker network inspect my_network      # View network configuration & connected containers
docker network rm my_network           # Remove network
 
# Run container on custom network
docker run -d --name web --network my_network nginx
 
# Connect/Disconnect existing container
docker network connect my_network web
docker network disconnect my_network web

System Cleanup

docker system df                       # Display Docker disk space usage
docker system prune                    # Remove stopped containers, unused networks, dangling images
docker system prune -a                 # Remove all unused images and stopped containers
docker system prune -a --volumes       # Remove everything including unused volumes
docker volume prune                    # Remove all unused volumes
docker image prune                     # Remove dangling images (untagged)

2. Dockerfile Reference

Basic Structure

# Step 1: Base Image
FROM node:20-alpine
 
# Step 2: Set Working Directory
WORKDIR /app
 
# Step 3: Copy Dependency Files & Install
COPY package*.json ./
RUN npm ci --only=production
 
# Step 4: Copy Application Code
COPY . .
 
# Step 5: Configure Environment & Networking
ENV PORT=3000
EXPOSE 3000
 
# Step 6: Define Non-root User
USER node
 
# Step 7: Container Startup Command
CMD ["node", "server.js"]

Key Instructions Reference

  • FROM: Base image (FROM ubuntu:22.04 or FROM alpine:3.19 AS base).
  • WORKDIR: Set working directory (WORKDIR /app).
  • COPY vs ADD: Use COPY for local files; use ADD only for auto-extracting tar archives or URLs.
  • RUN: Run build commands to create image layers (RUN apt-get update && apt-get install -y curl).
  • CMD vs ENTRYPOINT: ENTRYPOINT defines fixed main executable; CMD provides default arguments or default command.
  • ENV & ARG: ARG is build-time only; ENV persists inside container runtime.
  • EXPOSE: Document exposed container ports (EXPOSE 80 443).
  • USER: Set non-root user (USER node).
  • VOLUME: Declare mount point (VOLUME ["/data"]).
  • HEALTHCHECK: Container health probe (HEALTHCHECK --interval=30s CMD curl -f http://localhost/ || exit 1).

Multi-Stage Builds

# Stage 1: Build stage
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
 
# Stage 2: Production runtime stage
FROM nginx:alpine AS runner
COPY --from=builder /app/dist /usr/share/nginx/html
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]

3. Docker Compose

CLI Commands (Compose V2)

docker compose up                      # Start all services in foreground
docker compose up -d                   # Start all services in background (detached)
docker compose up --build -d           # Rebuild image before starting services
docker compose down                    # Stop and remove containers, networks
docker compose down -v                 # Also remove volumes
docker compose ps                      # List running services
docker compose logs -f web             # Follow logs for specific service ('web')
docker compose exec web sh             # Run interactive shell inside service
docker compose restart                 # Restart all services
docker compose pull                    # Pull latest images for services
docker compose build                   # Build or rebuild service images

docker-compose.yml Example

version: '3.8'
 
services:
  web:
    build:
      context: .
      dockerfile: Dockerfile
    image: myapp:1.0
    ports:
      - "8080:80"
    environment:
      - PORT=80
      - DB_HOST=db
      - DB_PASSWORD=${DB_PASS}
    env_file:
      - .env
    volumes:
      - ./src:/app/src
      - web_data:/var/www/uploads
    networks:
      - frontend
      - backend
    depends_on:
      db:
        condition: service_healthy
 
  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_USER: admin
      POSTGRES_PASSWORD: ${DB_PASS}
      POSTGRES_DB: main_db
    volumes:
      - pg_data:/var/lib/postgresql/data
    networks:
      - backend
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U admin -d main_db"]
      interval: 5s
      timeout: 5s
      retries: 5
 
volumes:
  web_data:
  pg_data:
 
networks:
  frontend:
  backend:
    internal: true

4. Docker Swarm

Cluster & Node Management

# Manager Node Init & Join Tokens
docker swarm init --advertise-addr <MANAGER-IP>
docker swarm join-token worker         # Show worker join command
docker swarm join-token manager        # Show manager join command
 
# Node Control
docker node ls                         # List cluster nodes
docker node promote <NODE-NAME>        # Promote worker to manager
docker node demote <NODE-NAME>         # Demote manager to worker
docker node update --availability drain <NODE-NAME> # Drain node for maintenance

Services & Stack Deployment

# Service Commands
docker service create --name web --replicas 3 -p 80:80 nginx:alpine
docker service ls                      # List services
docker service ps web                  # List service tasks (containers)
docker service scale web=5             # Scale replicas to 5
docker service update --image nginx:1.25-alpine web # Rolling update
docker service rm web                  # Remove service
 
# Stack Commands (using docker-compose.yml)
docker stack deploy -c docker-compose.yml my_stack # Deploy stack
docker stack ls                        # List stacks
docker stack services my_stack         # List stack services
docker stack rm my_stack               # Remove stack
 
# Secrets & Configs
echo "my_password" | docker secret create db_pass -
docker service create --name db --secret db_pass postgres

5. Docker Hub & Registries

Authentication & Image Management

# Authentication
docker login                           # Login to Docker Hub
docker login ghcr.io -u github_user    # Login to GitHub Container Registry
docker logout                          # Logout
 
# Image Tagging & Pushing
docker tag myimage:latest username/myrepo:1.0.0
docker push username/myrepo:1.0.0      # Push to Docker Hub
docker push ghcr.io/username/myrepo:1.0.0 # Push to GHCR
 
# Search & Pull
docker search nginx
docker pull ubuntu:latest

Multi-Architecture Build (docker buildx)

docker buildx create --name mybuilder --use
docker buildx build --platform linux/amd64,linux/arm64 -t username/myrepo:1.0.0 --push .

6. Docker Desktop & Local Developer Tools

Key Configuration

  • Resource Allocation: Adjust CPU cores, RAM limits, Swap space, and Virtual Disk size via GUI Settings ⚙️ → Resources.
  • Engine Backends:
    • Windows: Use WSL 2 Backend for native Linux kernel performance.
    • macOS: Enable VirtioFS file sharing and Rosetta 2 for x86_64 emulation on Apple Silicon.

Context Management (docker context)

docker context ls                      # List Docker contexts
docker context show                    # Show current active context
docker context use desktop-linux        # Switch to local Docker Desktop engine
docker context create remote --docker "host=ssh://user@remote-ip" # Add remote context

Local Kubernetes

  • Enable built-in single-node Kubernetes in Settings ⚙️ → Kubernetes.
  • Control cluster with kubectl config use-context docker-desktop and kubectl get nodes.