Docker Cheat Sheet
Images
Section titled “Images”Listing & Inspecting
Section titled “Listing & Inspecting”docker images # List imagesdocker images -a # Include intermediatedocker image ls # Same as above
docker inspect image_name # Detailed infodocker history image_name # Layer historyBuilding
Section titled “Building”docker build . # Build from Dockerfile in current dirdocker build -t myapp:1.0 . # With tagdocker build -t myapp:latest -t myapp:1.0 . # Multiple tagsdocker build -f Dockerfile.dev . # Specify Dockerfiledocker build --no-cache . # Ignore cachedocker build --target stage . # Build specific stage (multi-stage)docker build --build-arg VAR=value . # Pass build argument
# BuildKit (faster, better caching)DOCKER_BUILDKIT=1 docker build .Pulling & Pushing
Section titled “Pulling & Pushing”docker pull nginx # Pull from Docker Hubdocker pull nginx:1.24 # Specific tagdocker pull myregistry.com/image # From private registry
docker push myrepo/myimage:1.0 # Push to registrydocker tag myapp:1.0 myrepo/myapp:1.0 # Tag for pushing
docker login # Login to Docker Hubdocker login myregistry.com # Login to private registrydocker logoutRemoving
Section titled “Removing”docker rmi image_name # Remove imagedocker rmi image_id # By IDdocker rmi -f image_name # Force removedocker image prune # Remove dangling imagesdocker image prune -a # Remove all unused imagesContainers
Section titled “Containers”Running
Section titled “Running”docker run nginx # Run containerdocker run -d nginx # Detached (background)docker run -it ubuntu bash # Interactive with TTYdocker run --name mycontainer nginx # Named containerdocker run -p 8080:80 nginx # Port mapping host:containerdocker run -P nginx # Map all exposed portsdocker run -v /host:/container nginx # Volume mountdocker run -v myvolume:/data nginx # Named volumedocker run -e VAR=value nginx # Environment variabledocker run --env-file .env nginx # Env from filedocker run --rm nginx # Remove when stoppeddocker run --network mynet nginx # Attach to networkdocker run --restart always nginx # Restart policydocker run -w /app node npm start # Working directorydocker run -u 1000:1000 nginx # Run as user:groupdocker run --memory 512m nginx # Memory limitdocker run --cpus 0.5 nginx # CPU limitdocker run --entrypoint /bin/sh nginx # Override entrypointManaging
Section titled “Managing”docker ps # List running containersdocker ps -a # Include stoppeddocker ps -q # IDs onlydocker ps -l # Last created
docker start container_name # Start stopped containerdocker stop container_name # Stop container (graceful)docker restart container_name # Restartdocker kill container_name # Force stopdocker pause container_name # Pausedocker unpause container_name # Unpause
docker rm container_name # Remove stopped containerdocker rm -f container_name # Force remove runningdocker container prune # Remove all stoppedInteracting
Section titled “Interacting”docker exec -it container bash # Execute command in running containerdocker exec container ls /app # Non-interactive commanddocker exec -u root container cmd # As specific user
docker attach container # Attach to running container# Detach: Ctrl+P, Ctrl+Q
docker logs container # View logsdocker logs -f container # Follow logsdocker logs --tail 100 container # Last 100 linesdocker logs --since 1h container # Last hourdocker logs -t container # With timestamps
docker top container # Running processesdocker stats # Live resource usagedocker stats container # Specific containerdocker inspect container # Detailed infodocker port container # Port mappingsdocker diff container # Filesystem changes
docker cp container:/path ./local # Copy from containerdocker cp ./local container:/path # Copy to containerCreating Images from Containers
Section titled “Creating Images from Containers”docker commit container newimage:tagdocker export container > backup.tar # Export filesystemdocker import backup.tar newimage:tag # Import as imageDockerfile
Section titled “Dockerfile”Basic Structure
Section titled “Basic Structure”# Base imageFROM node:18-alpine
# MetadataLABEL maintainer="you@example.com"LABEL version="1.0"
# Set working directoryWORKDIR /app
# Set environment variablesENV NODE_ENV=productionENV PORT=3000
# Build argumentsARG VERSION=latest
# Copy filesCOPY package*.json ./COPY . .
# Run commands during buildRUN npm install --productionRUN npm run build
# Expose port (documentation)EXPOSE 3000
# Default commandCMD ["node", "server.js"]
# Or use ENTRYPOINT for fixed commandENTRYPOINT ["node"]CMD ["server.js"]Multi-stage Build
Section titled “Multi-stage Build”# Build stageFROM node:18 AS builderWORKDIR /appCOPY package*.json ./RUN npm ciCOPY . .RUN npm run build
# Production stageFROM node:18-alpineWORKDIR /appCOPY --from=builder /app/dist ./distCOPY --from=builder /app/node_modules ./node_modulesEXPOSE 3000CMD ["node", "dist/server.js"]Best Practices
Section titled “Best Practices”Version Pinning:
# Use specific tags, not :latestFROM node:18.17-alpine
# For production, pin to digest for reproducibilityFROM node:18.17-alpine@sha256:a1b2c3d4...Layer Caching:
# Order from least to most frequently changing# 1. Base image and system deps (rarely change)# 2. Application dependencies (change occasionally)# 3. Application code (changes often)
FROM node:18-alpineWORKDIR /app
# Dependencies firstCOPY package*.json ./RUN npm ci --only=production
# Code lastCOPY . .Reduce Image Size:
# Combine RUN commands and clean up in same layerRUN apt-get update && \ apt-get install -y --no-install-recommends \ curl \ git && \ rm -rf /var/lib/apt/lists/*
# Use multi-stage builds (see above)# Use minimal base images: alpine, slim, distrolessSecurity:
# Create non-root user with explicit UID/GIDRUN addgroup -g 1001 -S appgroup && \ adduser -u 1001 -S appuser -G appgroupUSER appuser
# Use COPY, not ADD (ADD auto-extracts unpredictably)COPY config.tar.gz /app/RUN tar -xzf config.tar.gz
# Handle secrets with BuildKit (not ENV)RUN --mount=type=secret,id=npmrc,target=/root/.npmrc \ npm ci --only=productionHealth Checks:
HEALTHCHECK --interval=30s --timeout=10s --retries=3 \ CMD curl -f http://localhost:3000/health || exit 1.dockerignore
Section titled “.dockerignore”# Version control.git.gitignore
# Dependencies (reinstalled in container)node_modulesvendor
# Build artifactsdistbuild*.log
# Development files.env.env.local*.mdDockerfile*docker-compose*
# IDE and OS.idea.vscode.DS_Store
# Secrets (never include)*.pem*.keycredentials.jsonSecurity Best Practices
Section titled “Security Best Practices”| Practice | Why |
|---|---|
| Use minimal base images | Alpine (~5MB) or distroless reduce attack surface |
| Run as non-root | Limits damage if container is compromised |
| Pin image versions | Prevents unexpected breaking changes |
| Use COPY over ADD | ADD has unpredictable extraction behavior |
| Scan images | Use docker scout, Snyk, or Trivy in CI |
| Sign images | Docker Content Trust or cosign for verification |
| Don’t store secrets in images | Use BuildKit secrets or runtime injection |
| Rebuild regularly | Pick up security patches in base images |
Production Patterns
Section titled “Production Patterns”Graceful Shutdown:
# Use exec form for proper signal handlingCMD ["node", "server.js"]
# Or with entrypoint scriptCOPY docker-entrypoint.sh /RUN chmod +x /docker-entrypoint.shENTRYPOINT ["/docker-entrypoint.sh"]#!/bin/shset -e
# Handle SIGTERM gracefullytrap 'kill -TERM $PID' TERM
node server.js &PID=$!wait $PIDMulti-environment Dockerfiles:
FROM node:18-alpineWORKDIR /appCOPY package*.json ./RUN npm installCOPY . .CMD ["npm", "run", "dev"]
# Dockerfile.prod (or use build args)FROM node:18-alpine AS builderWORKDIR /appCOPY package*.json ./RUN npm ciCOPY . .RUN npm run build
FROM node:18-alpineWORKDIR /appCOPY --from=builder /app/dist ./distCOPY --from=builder /app/node_modules ./node_modulesUSER nodeCMD ["node", "dist/server.js"]Anti-patterns
Section titled “Anti-patterns”| Anti-pattern | Fix |
|---|---|
| Running as root | Add USER with non-root user |
Using :latest | Pin specific version tags |
apt-get update alone | Combine with install in same RUN |
RUN cd /app | Use WORKDIR /app |
| Copying everything | Use .dockerignore, copy selectively |
| Large base images | Use -alpine, -slim, or distroless |
| Secrets in ENV/ARG | Use BuildKit secrets or runtime injection |
| No health checks | Add HEALTHCHECK instruction |
Instructions Reference
Section titled “Instructions Reference”| Instruction | Purpose |
|---|---|
FROM | Base image |
WORKDIR | Set working directory |
COPY | Copy files from host |
ADD | Copy with auto-extract/URL support |
RUN | Execute command during build |
ENV | Set environment variable |
ARG | Build-time variable |
EXPOSE | Document exposed port |
CMD | Default command (overridable) |
ENTRYPOINT | Fixed command |
VOLUME | Create mount point |
USER | Set user for subsequent commands |
LABEL | Add metadata |
HEALTHCHECK | Container health check |
SHELL | Override default shell |
Volumes
Section titled “Volumes”# Create volumedocker volume create myvolume
# List volumesdocker volume ls
# Inspect volumedocker volume inspect myvolume
# Remove volumedocker volume rm myvolumedocker volume prune # Remove unused volumes
# Use in containerdocker run -v myvolume:/data nginxdocker run -v /host/path:/container/path nginx # Bind mountdocker run -v /host/path:/container/path:ro nginx # Read-onlyNetworks
Section titled “Networks”# List networksdocker network ls
# Create networkdocker network create mynetworkdocker network create --driver bridge mynetworkdocker network create --subnet 172.20.0.0/16 mynetwork
# Inspect networkdocker network inspect mynetwork
# Connect/disconnect containerdocker network connect mynetwork containerdocker network disconnect mynetwork container
# Remove networkdocker network rm mynetworkdocker network prune # Remove unused
# Run container on networkdocker run --network mynetwork nginxdocker run --network mynetwork --network-alias db postgres
# Container communication# Containers on same network can reach each other by namedocker run --network mynetwork --name web nginxdocker run --network mynetwork --name api node# 'web' can reach 'api' via http://api:portNetwork Drivers
Section titled “Network Drivers”| Driver | Use Case |
|---|---|
bridge | Default, isolated network on single host |
host | Share host’s network (no isolation) |
none | No networking |
overlay | Multi-host networking (Swarm) |
macvlan | Assign MAC address, appear as physical device |
Docker Compose
Section titled “Docker Compose”docker-compose.yml
Section titled “docker-compose.yml”version: "3.8"
services: web: build: . # Or use image: # image: nginx:latest ports: - "3000:3000" environment: - NODE_ENV=production - DATABASE_URL=postgres://db:5432/mydb env_file: - .env volumes: - ./src:/app/src - node_modules:/app/node_modules depends_on: - db - redis networks: - frontend - backend restart: unless-stopped healthcheck: test: ["CMD", "curl", "-f", "http://localhost:3000/health"] interval: 30s timeout: 10s retries: 3
db: image: postgres:15 environment: POSTGRES_USER: user POSTGRES_PASSWORD: password POSTGRES_DB: mydb volumes: - postgres_data:/var/lib/postgresql/data networks: - backend
redis: image: redis:7-alpine networks: - backend
volumes: node_modules: postgres_data:
networks: frontend: backend:Commands
Section titled “Commands”# Start servicesdocker compose up # Foregrounddocker compose up -d # Detacheddocker compose up --build # Rebuild imagesdocker compose up service_name # Specific service
# Stop servicesdocker compose down # Stop and removedocker compose down -v # Also remove volumesdocker compose down --rmi all # Also remove imagesdocker compose stop # Stop only (keep containers)
# Manage servicesdocker compose ps # List containersdocker compose logs # View logsdocker compose logs -f service # Follow specific servicedocker compose exec service bash # Execute in running servicedocker compose run service cmd # Run one-off command
# Builddocker compose build # Build alldocker compose build service # Build specific
# Scaledocker compose up -d --scale web=3
# Otherdocker compose config # Validate and view configdocker compose pull # Pull imagesdocker compose restart # Restart servicesMultiple Compose Files
Section titled “Multiple Compose Files”# Override with additional filedocker compose -f docker-compose.yml -f docker-compose.prod.yml up
# Use .env file# docker-compose.yml can use ${VAR} syntax# Values loaded from .env automaticallySystem & Cleanup
Section titled “System & Cleanup”# System infodocker infodocker version
# Disk usagedocker system dfdocker system df -v # Verbose
# Clean updocker system prune # Remove unused datadocker system prune -a # More aggressivedocker system prune -a --volumes # Include volumes
# Individual cleanupdocker container prune # Stopped containersdocker image prune # Dangling imagesdocker image prune -a # All unused imagesdocker volume prune # Unused volumesdocker network prune # Unused networksRegistry & Repository
Section titled “Registry & Repository”# Search Docker Hubdocker search nginx
# Save/load images (for offline transfer)docker save -o image.tar myimage:tagdocker load -i image.tar
# Run local registrydocker run -d -p 5000:5000 --name registry registry:2docker tag myimage localhost:5000/myimagedocker push localhost:5000/myimageDebugging
Section titled “Debugging”# Container won't startdocker logs containerdocker inspect container
# Enter failed containerdocker commit failed_container debug_imagedocker run -it debug_image sh
# Check resource usagedocker stats
# Inspect networkingdocker network inspect bridgedocker exec container cat /etc/hosts
# Check mountsdocker inspect -f '{{ .Mounts }}' container
# Eventsdocker events # Real-time eventsdocker events --since 1hQuick Reference
Section titled “Quick Reference”| Task | Command |
|---|---|
| Build image | docker build -t name . |
| Run container | docker run -d -p 8080:80 name |
| List containers | docker ps -a |
| List images | docker images |
| Stop container | docker stop name |
| Remove container | docker rm name |
| Remove image | docker rmi name |
| View logs | docker logs -f name |
| Shell into container | docker exec -it name bash |
| Copy files | docker cp name:/path ./local |
| Compose up | docker compose up -d |
| Compose down | docker compose down |
| Clean up | docker system prune -a |
See Also
Section titled “See Also”- Shell — Scripting patterns used in Dockerfiles and entrypoints
- CI/CD
- Kubernetes
- PostgreSQL
- System Design
- Docker Lesson Plan — 8 lessons from images to Compose and security