Docker CLI Cheat Sheet

Essential Docker commands for images, containers, networking, volumes, and Compose.

Images

docker pull nginx:1.25-alpine
docker images
docker image ls --filter "dangling=true"
docker rmi myapp:1.0
docker image prune -a              # remove unused images
docker build -t myapp:1.0 .
docker build -t myapp:1.0 --target production .
docker build --no-cache -t myapp:1.0 .
docker build --build-arg VERSION=1.0 -t myapp:1.0 .
docker tag myapp:1.0 registry.example.com/myapp:1.0
docker push registry.example.com/myapp:1.0
docker history myapp:1.0
docker inspect myapp:1.0
docker save myapp:1.0 -o myapp.tar
docker load -i myapp.tar
docker scout cves myapp:1.0          # vulnerability scan

Containers

docker run -d --name web -p 8080:80 nginx:alpine
docker run -it --rm ubuntu:22.04 bash
docker run -d --restart unless-stopped myapp:1.0
docker run -d --memory=512m --cpus=1.5 myapp:1.0
docker run -d --read-only -v app-data:/data myapp:1.0
docker run -d --user 10001:10001 myapp:1.0
docker run -d --init myapp:1.0       # tini as PID 1

docker ps
docker ps -a
docker stop web
docker start web
docker restart web
docker rm web
docker rm -f web                   # force remove running
docker container prune             # remove stopped containers

docker logs web
docker logs -f --tail 100 web
docker exec -it web sh
docker exec web cat /etc/nginx/nginx.conf
docker cp web:/app/logs.txt ./logs.txt
docker inspect web
docker top web
docker stats
docker stats web --no-stream

Networks

docker network ls
docker network create app-net
docker network create --driver bridge --subnet 172.20.0.0/16 app-net
docker network inspect app-net
docker network connect app-net web
docker network disconnect app-net web
docker network rm app-net
docker network prune

# Run on custom network (containers resolve by name)
docker run -d --name api --network app-net myapi:1.0
docker run -d --name db --network app-net postgres:16

Volumes

docker volume create pgdata
docker volume ls
docker volume inspect pgdata
docker volume rm pgdata
docker volume prune

docker run -d -v pgdata:/var/lib/postgresql/data postgres:16
docker run -d -v $(pwd)/src:/app/src myapp:dev     # bind mount
docker run -d -v $(pwd)/config:/app/config:ro myapp:1.0

# Backup volume
docker run --rm -v pgdata:/data -v $(pwd):/backup alpine \
  tar czf /backup/pgdata.tar.gz -C /data .

Dockerfile Quick Reference

FROM python:3.12-slim-bookworm
ARG VERSION=1.0
ENV PYTHONUNBUFFERED=1
WORKDIR /app
RUN apt-get update && apt-get install -y curl && rm -rf /var/lib/apt/lists/*
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN useradd -r -u 10001 appuser
USER 10001
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s CMD curl -f http://localhost:8080/health || exit 1
ENTRYPOINT ["python"]
CMD ["app.py"]

Docker Compose

docker compose up -d
docker compose up -d --build
docker compose down
docker compose down -v             # remove volumes too
docker compose ps
docker compose logs -f api
docker compose exec api sh
docker compose restart api
docker compose pull
docker compose config              # validate and render
docker compose -f compose.yml -f compose.prod.yml up -d

System & Debugging

docker info
docker version
docker system df                   # disk usage
docker system prune -a             # clean everything unused
docker events
docker context ls
docker context use desktop-linux

# Debug container that exits immediately
docker run --rm myapp:1.0
docker logs $(docker ps -lq)

# Enter namespaces of running container
docker run -it --rm --pid container:web --net container:web nicolaka/netshoot