Quick reference tables
Images
| Command | What it does |
|---|---|
docker images | List all local images |
docker pull nginx | Pull an image from Docker Hub |
docker pull nginx:1.25 | Pull a specific tag |
docker build -t myapp . | Build an image from Dockerfile in current dir |
docker build -t myapp:v2 . | Build with a specific tag |
docker build -f Dockerfile.prod -t myapp . | Use a specific Dockerfile |
docker rmi nginx | Remove an image |
docker rmi $(docker images -q) | Remove all images |
docker image prune | Remove dangling (untagged) images |
docker image prune -a | Remove all unused images |
docker tag myapp myapp:v1 | Tag an image |
docker push user/myapp:v1 | Push to Docker Hub |
docker history nginx | Show layers of an image |
docker inspect nginx | Full image metadata (JSON) |
Containers — run
| Command | What it does |
|---|---|
docker run nginx | Run a container (foreground) |
docker run -d nginx | Run detached (background) |
docker run -d -p 8080:80 nginx | Map host port 8080 → container port 80 |
docker run -d --name web nginx | Run with a name |
docker run -it ubuntu bash | Interactive terminal |
docker run --rm nginx | Auto-remove container when it exits |
docker run -e VAR=value nginx | Set environment variable |
docker run --env-file .env nginx | Load env vars from file |
docker run -v /host:/container nginx | Bind mount a volume |
docker run -v myvolume:/data nginx | Named volume |
docker run --network mynet nginx | Connect to a network |
docker run --restart always nginx | Always restart if it crashes |
docker run -m 512m nginx | Limit memory to 512MB |
docker run --cpus 1.5 nginx | Limit to 1.5 CPUs |
Containers — manage
| Command | What it does |
|---|---|
docker ps | List running containers |
docker ps -a | List all containers (including stopped) |
docker stop web | Stop a running container (graceful) |
docker kill web | Kill a container (immediate) |
docker start web | Start a stopped container |
docker restart web | Restart a container |
docker rm web | Remove a stopped container |
docker rm -f web | Force remove a running container |
docker rm $(docker ps -aq) | Remove all containers |
docker rename old new | Rename a container |
docker pause web | Pause all processes in container |
docker unpause web | Unpause |
Containers — inspect & debug
| Command | What it does |
|---|---|
docker logs web | Show container logs |
docker logs -f web | Follow logs in real time |
docker logs --tail 100 web | Show last 100 lines |
docker logs --since 1h web | Logs from last hour |
docker inspect web | Full container metadata (JSON) |
docker stats | Live resource usage for all containers |
docker stats web | Resource usage for one container |
docker top web | Show running processes inside container |
docker diff web | Show filesystem changes |
docker port web | Show port mappings |
docker exec -it web bash | Open a shell inside running container |
docker exec web cat /etc/hosts | Run a single command in container |
docker cp web:/app/file.log ./ | Copy file from container to host |
docker cp ./file.txt web:/app/ | Copy file from host to container |
Volumes
| Command | What it does |
|---|---|
docker volume ls | List all volumes |
docker volume create mydata | Create a named volume |
docker volume inspect mydata | Show volume details |
docker volume rm mydata | Remove a volume |
docker volume prune | Remove all unused volumes |
Networks
| Command | What it does |
|---|---|
docker network ls | List networks |
docker network create mynet | Create a bridge network |
docker network inspect mynet | Show network details |
docker network connect mynet web | Connect container to network |
docker network disconnect mynet web | Disconnect container from network |
docker network rm mynet | Remove a network |
docker network prune | Remove all unused networks |
Docker Compose
| Command | What it does |
|---|---|
docker compose up | Start all services (foreground) |
docker compose up -d | Start all services (detached) |
docker compose up --build | Rebuild images before starting |
docker compose down | Stop and remove containers |
docker compose down -v | Also remove volumes |
docker compose stop | Stop containers (don’t remove) |
docker compose start | Start stopped containers |
docker compose restart | Restart all services |
docker compose ps | List services and their status |
docker compose logs | Show logs for all services |
docker compose logs -f web | Follow logs for one service |
docker compose exec web bash | Open shell in a running service |
docker compose run web bash | Run a one-off command in a service |
docker compose build | Build or rebuild images |
docker compose pull | Pull latest images |
docker compose config | Validate and show resolved config |
Cleanup — reclaim disk space
| Command | What it does |
|---|---|
docker system df | Show disk usage |
docker system prune | Remove all stopped containers, unused networks, dangling images |
docker system prune -a | Also remove unused images (not just dangling) |
docker system prune -a --volumes | Remove everything including volumes |
docker container prune | Remove stopped containers |
docker image prune | Remove dangling images |
docker volume prune | Remove unused volumes |
docker network prune | Remove unused networks |
Detailed sections
Writing a Dockerfile
# Start from a base image
FROM node:20-alpine
# Set working directory
WORKDIR /app
# Copy dependency files first (for layer caching)
COPY package*.json ./
# Install dependencies
RUN npm ci --omit=dev
# Copy application code
COPY . .
# Expose the port
EXPOSE 3000
# Set environment variable
ENV NODE_ENV=production
# Default command
CMD ["node", "server.js"]
Layer caching tip: Copy package.json and install dependencies before copying source code. Dependencies change less often than code — this way Docker only re-runs npm install when dependencies actually change.
Writing a docker-compose.yml
services:
web:
build: .
ports:
- "3000:3000"
environment:
- NODE_ENV=production
- DATABASE_URL=postgres://user:pass@db:5432/mydb
volumes:
- ./uploads:/app/uploads
depends_on:
- db
restart: unless-stopped
db:
image: postgres:16-alpine
environment:
POSTGRES_USER: user
POSTGRES_PASSWORD: pass
POSTGRES_DB: mydb
volumes:
- pgdata:/var/lib/postgresql/data
restart: unless-stopped
volumes:
pgdata:
Run it:
docker compose up -d
docker compose logs -f
docker compose exec web bash
docker compose down
Debugging a container that won’t start
# See what happened — check exit code and last logs
docker ps -a
docker logs <container_id>
# Try running with a shell instead of the default command
docker run -it --entrypoint bash myapp
# Or override the command
docker run -it myapp sh
# Inspect the full config
docker inspect <container_id>
Multi-stage builds — smaller production images
# Stage 1: Build
FROM node:20 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
# Stage 2: Production (no dev deps, no source)
FROM node:20-alpine
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/package*.json ./
RUN npm ci --omit=dev
EXPOSE 3000
CMD ["node", "dist/server.js"]
The final image only contains what the second stage copies — no build tools, no source code, no dev dependencies. Often 5–10x smaller.
.dockerignore — keep images clean
node_modules
.git
.env
*.log
dist
coverage
.DS_Store
Same syntax as .gitignore. Without this, COPY . . sends your entire project including node_modules to the build context, making builds slow and images bloated.
Useful one-liners
# Stop all running containers
docker stop $(docker ps -q)
# Remove all stopped containers
docker rm $(docker ps -aq)
# Get a container's IP address
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' web
# Follow logs for all compose services
docker compose logs -f
# Rebuild and restart a single service
docker compose up -d --build web
# See environment variables inside a container
docker exec web env
# Export an image to a tar file
docker save myapp:v1 > myapp.tar
# Load an image from a tar file
docker load < myapp.tar
Want a real-world example? See How to Write a Production Dockerfile for Node.js.
Related Reading.
curl Cheat Sheet: API Testing, Auth & File Upload
Complete curl reference — GET and POST requests, headers, authentication, file upload, response inspection, timing breakdown, webhook testing, and scripting patterns.
Linux & Bash Cheat Sheet: Commands Every Dev Needs
Complete Linux and Bash reference — file operations, permissions, processes, grep, find, networking, pipes, cron jobs, SSH, and shell scripting.
SSH & GPG Cheat Sheet: Keys, Tunnels & Signed Commits
Complete SSH and GPG reference — key generation, ssh-agent, config file aliases, port forwarding, database tunneling, GPG signing, and signed git commits.