My Docker cheatsheet

Cleanup

TaskCommand
Remove all imagesdocker rmi $(docker images -a -q)
Prune system (containers, networks, dangling images, build cache)docker system prune
Same, plus all unused images and volumesdocker system prune -a --volumes
Prune unused volumes onlydocker volume prune
Prune networks onlydocker network prune
Stop all running containersdocker stop $(docker ps -q)

Permissions: run Docker without sudo

sudo groupadd docker            # often already exists
sudo usermod -aG docker "$USER" # then log out and back in

Shell into a running container

docker exec -it <container-id> /bin/bash

If bash isn’t installed in the image (common on Alpine-based images), fall back to:

docker exec -it <container-id> /bin/sh

Diagnostics

docker info                      # daemon and host details
docker system df                 # disk usage by images/containers/volumes
docker logs <container-id>       # container stdout/stderr
docker logs -f <container-id>    # ...and follow

Limit Docker log size

Container logs are unlimited by default. Cap them in /etc/docker/daemon.json:

{
  "log-driver": "json-file",
  "log-opts": {
    "max-size": "50m",
    "max-file": "3"
  }
}

Then:

sudo systemctl restart docker

Existing containers keep their old log config until recreated.

More daemon options: Docker daemon configuration file.

Aliasing docker-compose to docker compose

# in ~/.bashrc or ~/.zshrc
alias docker-compose='docker compose --compatibility'

Bash and zsh aliases automatically forward arguments, so any docker-compose up -d, docker-compose logs -f web, etc. just works.