M
MeshWorld.
Cheatsheet Docker Docker Compose DevOps Containers Terminal Developer Tools 8 min read

Docker Cheat Sheet: Images, Containers, Compose & More

By Vishnu Damwala

Quick reference tables

Images

CommandWhat it does
docker imagesList all local images
docker pull nginxPull an image from Docker Hub
docker pull nginx:1.25Pull 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 nginxRemove an image
docker rmi $(docker images -q)Remove all images
docker image pruneRemove dangling (untagged) images
docker image prune -aRemove all unused images
docker tag myapp myapp:v1Tag an image
docker push user/myapp:v1Push to Docker Hub
docker history nginxShow layers of an image
docker inspect nginxFull image metadata (JSON)

Containers — run

CommandWhat it does
docker run nginxRun a container (foreground)
docker run -d nginxRun detached (background)
docker run -d -p 8080:80 nginxMap host port 8080 → container port 80
docker run -d --name web nginxRun with a name
docker run -it ubuntu bashInteractive terminal
docker run --rm nginxAuto-remove container when it exits
docker run -e VAR=value nginxSet environment variable
docker run --env-file .env nginxLoad env vars from file
docker run -v /host:/container nginxBind mount a volume
docker run -v myvolume:/data nginxNamed volume
docker run --network mynet nginxConnect to a network
docker run --restart always nginxAlways restart if it crashes
docker run -m 512m nginxLimit memory to 512MB
docker run --cpus 1.5 nginxLimit to 1.5 CPUs

Containers — manage

CommandWhat it does
docker psList running containers
docker ps -aList all containers (including stopped)
docker stop webStop a running container (graceful)
docker kill webKill a container (immediate)
docker start webStart a stopped container
docker restart webRestart a container
docker rm webRemove a stopped container
docker rm -f webForce remove a running container
docker rm $(docker ps -aq)Remove all containers
docker rename old newRename a container
docker pause webPause all processes in container
docker unpause webUnpause

Containers — inspect & debug

CommandWhat it does
docker logs webShow container logs
docker logs -f webFollow logs in real time
docker logs --tail 100 webShow last 100 lines
docker logs --since 1h webLogs from last hour
docker inspect webFull container metadata (JSON)
docker statsLive resource usage for all containers
docker stats webResource usage for one container
docker top webShow running processes inside container
docker diff webShow filesystem changes
docker port webShow port mappings
docker exec -it web bashOpen a shell inside running container
docker exec web cat /etc/hostsRun 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

CommandWhat it does
docker volume lsList all volumes
docker volume create mydataCreate a named volume
docker volume inspect mydataShow volume details
docker volume rm mydataRemove a volume
docker volume pruneRemove all unused volumes

Networks

CommandWhat it does
docker network lsList networks
docker network create mynetCreate a bridge network
docker network inspect mynetShow network details
docker network connect mynet webConnect container to network
docker network disconnect mynet webDisconnect container from network
docker network rm mynetRemove a network
docker network pruneRemove all unused networks

Docker Compose

CommandWhat it does
docker compose upStart all services (foreground)
docker compose up -dStart all services (detached)
docker compose up --buildRebuild images before starting
docker compose downStop and remove containers
docker compose down -vAlso remove volumes
docker compose stopStop containers (don’t remove)
docker compose startStart stopped containers
docker compose restartRestart all services
docker compose psList services and their status
docker compose logsShow logs for all services
docker compose logs -f webFollow logs for one service
docker compose exec web bashOpen shell in a running service
docker compose run web bashRun a one-off command in a service
docker compose buildBuild or rebuild images
docker compose pullPull latest images
docker compose configValidate and show resolved config

Cleanup — reclaim disk space

CommandWhat it does
docker system dfShow disk usage
docker system pruneRemove all stopped containers, unused networks, dangling images
docker system prune -aAlso remove unused images (not just dangling)
docker system prune -a --volumesRemove everything including volumes
docker container pruneRemove stopped containers
docker image pruneRemove dangling images
docker volume pruneRemove unused volumes
docker network pruneRemove 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.