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 effectService 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 daemonContainer 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 containerImage 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 metadataPort 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 myappLogs 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 containerDocker 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 webSystem 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.04orFROM alpine:3.19 AS base).WORKDIR: Set working directory (WORKDIR /app).COPYvsADD: UseCOPYfor local files; useADDonly for auto-extracting tar archives or URLs.RUN: Run build commands to create image layers (RUN apt-get update && apt-get install -y curl).CMDvsENTRYPOINT:ENTRYPOINTdefines fixed main executable;CMDprovides default arguments or default command.ENV&ARG:ARGis build-time only;ENVpersists 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 imagesdocker-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: true4. 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 maintenanceServices & 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 postgres5. 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:latestMulti-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 contextLocal Kubernetes
- Enable built-in single-node Kubernetes in Settings ⚙️ → Kubernetes.
- Control cluster with
kubectl config use-context docker-desktopandkubectl get nodes.