Docker Quick Reference

Containers, images, compose, volumes, networking and Dockerfile patterns.

Installation

# Install Docker on Ubuntu/Debian
sudo apt update
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
sudo chmod a+r /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 > /dev/null

sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

# Run Docker without sudo
sudo usermod -aG docker $USER
newgrp docker

# Verify installation
docker run hello-world

Container Lifecycle

CommandDescription
docker run imageCreate and start a container
docker run -d imageRun in detached (background) mode
docker run -it image bashInteractive shell inside container
docker run --name my-app -p 8080:80 imageNamed container with port mapping
docker run --rm imageAuto-remove container when stopped
docker run -e KEY=val imagePass environment variable
docker run --env-file .env imageLoad env vars from file
docker psList running containers
docker ps -aList all containers (including stopped)
docker stop containerGraceful stop (SIGTERM → SIGKILL)
docker start containerStart a stopped container
docker restart containerStop and start a container
docker rm containerRemove stopped container
docker rm -f containerForce remove running container
docker exec -it container bashShell into running container
docker logs -f containerFollow container logs
docker inspect containerFull container details as JSON
docker statsLive CPU/memory/network usage

Images

CommandDescription
docker imagesList local images
docker pull image:tagDownload image from registry
docker build -t name:tag .Build image from Dockerfile
docker build --no-cache -t name .Build without layer cache
docker tag image:v1 repo/image:v1Tag an image for pushing
docker push repo/image:tagPush to registry
docker rmi imageRemove an image
docker image pruneRemove dangling images
docker system prune -aRemove all unused data (images, containers, networks)
docker history imageShow image layer history

Docker Compose

CommandDescription
docker compose up -dStart all services in background
docker compose downStop and remove containers, networks
docker compose down -vAlso remove volumes
docker compose psList compose services
docker compose logs -f svcFollow logs for a service
docker compose buildBuild/rebuild services
docker compose pullPull latest images
docker compose exec svc bashShell into a service container
docker compose restart svcRestart a specific service
docker compose configValidate and display resolved config

Example compose.yaml

services:
  web:
    build: .
    ports:
      - "3000:3000"
    environment:
      - NODE_ENV=production
      - DATABASE_URL=postgres://db:5432/app
    depends_on:
      db:
        condition: service_healthy
    restart: unless-stopped

  db:
    image: postgres:16-alpine
    volumes:
      - pgdata:/var/lib/postgresql/data
    environment:
      POSTGRES_DB: app
      POSTGRES_USER: user
      POSTGRES_PASSWORD_FILE: /run/secrets/db_password
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U user -d app"]
      interval: 5s
      retries: 5

volumes:
  pgdata:

Volumes

CommandDescription
docker volume create mydataCreate a named volume
docker volume lsList all volumes
docker volume inspect mydataVolume details
docker volume rm mydataRemove a volume
docker volume pruneRemove unused volumes

Mount types

# Named volume (Docker-managed)
docker run -v mydata:/app/data image

# Bind mount (host path)
docker run -v $(pwd)/config:/app/config:ro image

# tmpfs mount (in-memory, no persistence)
docker run --tmpfs /app/tmp image

Networking

CommandDescription
docker network lsList networks
docker network create mynetCreate a bridge network
docker network inspect mynetNetwork details
docker network connect mynet containerAttach container to network
docker network disconnect mynet containerDetach container from network
docker network rm mynetRemove a network
# Containers on the same user-defined network can resolve each other by name
docker network create app-net
docker run -d --name api --network app-net my-api
docker run -d --name web --network app-net my-web
# "web" can reach "api" via http://api:3000

Dockerfile Reference

# Multi-stage build — keeps final image small
FROM node:20-alpine AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci --only=production
COPY . .
RUN npm run build

FROM node:20-alpine
WORKDIR /app
RUN addgroup -S appgroup && adduser -S appuser -G appgroup
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modules
COPY --from=builder /app/package.json ./
USER appuser
EXPOSE 3000
HEALTHCHECK --interval=30s --timeout=3s \
  CMD wget -qO- http://localhost:3000/health || exit 1
CMD ["node", "dist/index.js"]
InstructionPurpose
FROMBase image (use alpine variants for smaller size)
WORKDIRSet working directory inside container
COPYCopy files from build context
RUNExecute command during build (each creates a layer)
ENVSet environment variable
ARGBuild-time variable (not in final image)
EXPOSEDocument the port (doesn't actually publish)
USERSwitch to non-root user
HEALTHCHECKContainer health monitoring command
CMDDefault command when container starts
ENTRYPOINTFixed executable (CMD becomes arguments)

Useful Patterns

Copy files from container

docker cp container:/app/logs ./logs
docker cp ./config.json container:/app/config.json

Run one-off commands

# Database dump
docker exec db pg_dump -U user dbname > backup.sql

# Run migration
docker compose exec web npm run migrate

# Quick debug container in same network
docker run --rm -it --network app-net alpine sh

Resource limits

docker run -d --name api \
  --memory=512m \
  --cpus=1.5 \
  --restart=unless-stopped \
  my-api

Troubleshooting

ProblemSolution
Permission denied on socketsudo usermod -aG docker $USER then log out/in
Port already in usess -tulnp | grep :PORT to find and kill the process
Container exits immediatelydocker logs container — check for missing env vars or config errors
Out of disk spacedocker system prune -a --volumes to reclaim space
DNS not working in containerCheck /etc/docker/daemon.json for custom DNS, or use --dns 8.8.8.8
Build cache staledocker build --no-cache -t name .
Can't connect between containersEnsure they're on the same user-defined network (not default bridge)
# Useful debug commands
docker inspect --format='{{.State.ExitCode}}' container
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container
docker system df                    # Show Docker disk usage
docker events --since 10m           # Recent Docker events