Container startet nicht - systematische Diagnose in Docker

Container startet nicht - systematische Diagnose in Docker

Ein Container startet nicht und du weißt nicht warum — diese Schritt-für-Schritt-Diagnose führt dich systematisch zur Ursache.

Schritt 1: Container-Status prüfen

docker ps -a

Der wichtigste Wert ist die Spalte STATUS. Ein gestoppter Container zeigt Exited (CODE) — der Exit-Code ist der erste Hinweis auf die Fehlerursache.

Schritt 2: Logs lesen

docker logs containername
docker logs --tail 50 containername

Die letzten Zeilen enthalten fast immer die eigentliche Fehlermeldung. --tail 50 begrenzt die Ausgabe auf die letzten 50 Zeilen, was bei gesprächigen Containern sinnvoll ist.

Schritt 3: Container inspizieren

docker inspect containername

Die relevanten Abschnitte sind Config (Umgebungsvariablen, Entrypoint, Cmd) und State (ExitCode, OOMKilled, Error). Gezielt abfragen:

docker inspect containername --format '{{.State}}'
docker inspect containername --format '{{.State.ExitCode}}'

Schritt 4: Interaktiv debuggen

Wenn der Container sofort crasht, lässt er sich nicht mit exec betreten. Stattdessen: Image direkt mit einer Shell starten und den Entrypoint überschreiben.

docker run -it --entrypoint sh imagename
# Bei Alpine-Images
docker run -it --entrypoint /bin/sh imagename

Jetzt kann man manuell prüfen, ob Dateien vorhanden sind, Umgebungsvariablen korrekt gesetzt sind und der eigentliche Startbefehl von Hand ausgeführt werden.

Schritt 5: Port-Konflikte prüfen

ss -tlnp | grep :8080
# oder
lsof -i :8080

Ein bereits belegter Port verhindert den Container-Start. Lösung: Host-Port in der Compose-Datei ändern (HOST:CONTAINER).

Schritt 6: Volume-Berechtigungen prüfen

docker run -it --entrypoint sh imagename
ls -la /app/data

Bind-Mounts erben die Berechtigungen vom Host. Wenn der Container-Prozess als User 1000 läuft, aber das Host-Verzeichnis root gehört, schlägt der Start fehl.

Exit-Codes und ihre Bedeutung

| Code | Bedeutung |
|------|-----------|
| 0 | Prozess sauber beendet (kein Fehler, aber kein Restart-Kandidat ohne unless-stopped) |
| 1 | Allgemeiner Applikationsfehler — Logs prüfen |
| 125 | Docker-eigener Fehler (falsches Flag, unbekannter Befehl) |
| 126 | Entrypoint nicht ausführbar — Berechtigungsproblem |
| 127 | Befehl nicht gefunden — falscher Entrypoint oder PATH falsch |
| 137 | SIGKILL empfangen — meistens OOMKilled (zu wenig RAM) |
| 139 | Segmentation Fault — fehlerhafte Binary oder falsche Architektur (z. B. ARM-Image auf x86) |

OOMKilled erkennen

docker inspect containername --format '{{.State.OOMKilled}}'

Gibt true zurück, wenn der Kernel den Container wegen Speichermangels beendet hat. Lösung: Memory-Limit erhöhen oder Swap aktivieren.

deploy:
  resources:
    limits:
      memory: 512m

Zusammenfassung

Der schnellste Diagnosepfad: docker ps -a → Exit-Code notieren → docker logs → Fehler lesen → bei Bedarf docker inspect → interaktiv mit überschriebenem Entrypoint debuggen. In 90 % der Fälle reicht die Log-Ausgabe allein.