Spickzettel

Docker-Fehlersuche

Container, die nicht starten, die Disk vollschreiben oder einander nicht erreichen — die Befehle, um herauszufinden, warum. Funktioniert auch mit Podman (podman …).

Exit-Codes

0
Normal beendet
1
Anwendungsfehler — Logs prüfen
125
docker run selbst ist fehlgeschlagen (falsche Option, Image nicht gefunden)
126
Befehl nicht ausführbar (Berechtigungen)
127
Befehl im Image nicht gefunden
137
Abgeschossen (SIGKILL) — Speicher voll (OOMKilled prüfen) oder docker kill
139
Segmentation Fault
143
Beendet (SIGTERM) — normales docker stop

Container

  • docker ps -a

    Alle Container, auch gestoppte

  • docker ps --format 'table {{.Names}}\t{{.Status}}\t{{.Ports}}'

    Kompakte Übersicht: Name, Status, Ports

  • docker inspect -f '{{.State.Status}} exit={{.State.ExitCode}} oom={{.State.OOMKilled}} restarts={{.RestartCount}}' <container>

    Warum hat er gestoppt? Exit-Code, OOM-Kill, Anzahl Neustarts

  • docker inspect <container>

    Komplette Konfiguration: Mounts, Env, Netzwerk, Restart-Policy

  • docker restart <container>

    Container neu starten

  • docker update --restart unless-stopped <container>

    Autostart aktivieren (nach Neustarts und Abstürzen)

  • docker update --restart no <container>

    Autostart deaktivieren

  • docker top <container>

    Prozesse im Container

  • docker rm -f <container>

    Vorsicht Container entfernen (Daten in Volumes bleiben erhalten)

Logs & Events

  • docker logs -f --tail 100 <container>

    Die letzten 100 Logzeilen live mitlesen

  • docker logs --since 30m -t <container>

    Letzte 30 Minuten mit Zeitstempel

  • docker logs <container> 2>&1 | grep -i error

    Log durchsuchen (inklusive stderr)

  • docker events --since 1h

    Starts, Stopps, OOM-Kills und Health-Änderungen der letzten Stunde

  • docker inspect -f '{{json .State.Health}}' <container>

    Healthcheck-Status und letzte Ergebnisse

  • journalctl -u docker --since "1 hour ago"

    Log des Docker-Daemons

Im Container

  • docker exec -it <container> sh

    Shell öffnen (bash, wenn das Image sie hat)

  • docker exec -u 0 -it <container> sh

    Shell als root, auch wenn das Image als Benutzer läuft

  • docker exec <container> env

    Umgebungsvariablen, die die App sieht

  • docker exec <container> getent hosts <other-service>

    Löst der Container einen anderen Dienst per Name auf?

  • docker cp <container>:<path> .

    Datei aus dem Container kopieren

  • docker run --rm -it --network container:<container> nicolaka/netshoot

    Debug-Werkzeugkiste (dig, curl, tcpdump…) im Netzwerk-Namespace des Containers

  • docker run --rm -it --entrypoint sh <image>

    Image mit einer Shell statt dem normalen Befehl starten

Ressourcen & Speicherplatz

  • docker stats --no-stream

    CPU, RAM, Netzwerk und I/O pro Container

  • docker system df

    Platzbedarf von Images, Containern, Volumes, Build-Cache

  • docker system df -v

    Dasselbe, pro Image/Container/Volume

  • du -sh /var/lib/docker/containers/*/*-json.log | sort -h | tail

    Größte Container-Logdateien

  • docker image prune -a

    Vorsicht Alle Images entfernen, die kein Container nutzt

  • docker builder prune

    Vorsicht Build-Cache entfernen

  • docker system prune

    Vorsicht Gestoppte Container, ungenutzte Netzwerke und verwaiste Images entfernen

  • docker volume ls -f dangling=true

    Volumes, die kein Container nutzt — vor dem Löschen prüfen!

Netzwerk

  • docker network ls

    Netzwerke

  • docker network inspect <network>

    Subnetz, Gateway und verbundene Container

  • docker port <container>

    Veröffentlichte Ports

  • docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}} {{end}}' <container>

    IP-Adresse(n) eines Containers

  • ss -tlpn | grep docker-proxy

    Veröffentlichte Ports auf Host-Seite

  • firewall-cmd --zone=docker --list-all

    AlmaLinux/RHEL: firewalld-Zone von Docker (veröffentlichte Ports umgehen deine Zonenregeln!)

  • nft list ruleset | grep -i docker

    NAT-/Forwarding-Regeln, die Docker angelegt hat

Docker Compose

  • docker compose ps

    Dienste des Projekts im aktuellen Verzeichnis

  • docker compose logs -f --tail=100 <service>

    Log eines Dienstes live mitlesen

  • docker compose config

    Finale Konfiguration prüfen und anzeigen (Env-Variablen aufgelöst)

  • docker compose up -d

    Alles anlegen/aktualisieren und starten

  • docker compose pull && docker compose up -d

    Auf die neuesten Images aktualisieren

  • docker compose up -d --force-recreate <service>

    Einen Dienst neu erstellen (z. B. nach Env-Änderungen)

  • docker compose exec <service> sh

    Shell in einem Dienst

  • docker compose down

    Container und Netzwerke stoppen und entfernen (Volumes bleiben)

  • docker compose down -v

    Vorsicht Löscht auch benannte Volumes — Datenverlust!

Images

  • docker images

    Lokale Images und Größen

  • docker inspect -f '{{.Config.Image}}' <container>

    Welches Image ein Container verwendet

  • docker image inspect <image> | grep -A5 -E "Env|Entrypoint|Cmd"

    Standard-Env, Entrypoint und Befehl eines Images

  • docker history <image>

    Layer und ihre Größe

  • docker pull <image>:<tag>

    Image herunterladen/aktualisieren

Daemon & Einrichtung

  • systemctl status docker

    Läuft der Daemon?

  • systemctl enable --now docker

    Aktivieren: Docker jetzt und beim Boot starten

  • systemctl disable --now docker docker.socket

    Deaktivieren: Docker stoppen und am Starten hindern (sonst startet ihn der Socket wieder)

  • docker info

    Storage-Treiber, cgroup-Version, Root-Verzeichnis, Warnungen am Ende

  • docker version

    Client- und Server-Version

  • cat /etc/docker/daemon.json

    Daemon-Konfiguration — hier die Log-Rotation setzen: {"log-opts": {"max-size": "10m", "max-file": "3"}}

  • dnf config-manager --add-repo https://download.docker.com/linux/rhel/docker-ce.repo && dnf install docker-ce docker-ce-cli containerd.io docker-compose-plugin

    Docker CE auf AlmaLinux/RHEL 9 installieren

  • podman ps -a

    AlmaLinux bringt Podman mit: die meisten docker-Befehle funktionieren als podman …

Dasselbe im Terminal

$ curl tools.otw.solutions/docker/logs

Ganzer Spickzettel im Terminal (englisch): curl tools.otw.solutions/docker | less