Docker-Container-Neustarts richtig konfigurieren
Was dieser Artikel über Container-Neustarts behandelt
- Welche Restart-Policies es gibt.
- Unterschiede zwischen
always,unless-stoppedundon-failure. - Wie man Policies in Compose setzt.
- Wann welche Policy sinnvoll ist.
- Typische Fehler und deren Lösungen.
Einleitung: Docker-Container-Neustarts richtig konfigurieren
In produktiven Setups sollen Container nach einem Absturz, einem Server-Neustart oder einem Fehler automatisch wieder hochfahren. Docker bietet dafür sogenannte Restart-Policies. Sie legen fest, wann und wie oft ein Container neu gestartet wird. Die falsche Policy kann aber auch dazu führen, dass ein defekter Container endlos versucht zu starten oder unerwünschte Neustarts verursacht.
Dieser Artikel zeigt, wie man Restart-Policies richtig einsetzt.
Wichtige Begriffe
- Restart-Policy: Verhalten beim Beenden des Containers.
- always: Container wird immer neu gestartet, auch nach Reboot.
- unless-stopped: Startet neu, ausser der Container wurde manuell gestoppt.
- on-failure: Nur bei Fehlern.
- no: Kein automatischer Neustart.
- restart_delay: Wartezeit zwischen Neustarts.
- max-retries: Maximale Versuche für
on-failure. - exit code: Rückgabewert des Prozesses.
Verfügbare Restart-Policies
| Policy | Beschreibung |
|---|---|
| no | Nie automatisch neu starten. |
| on-failure | Neu starten, wenn Exit-Code ungleich 0. |
| always | Immer neu starten, auch nach Server-Reboot. |
| unless-stopped | Immer neu starten, ausser manuell gestoppt. |
always
services:
app:
image: nginx
restart: always
Sinnvoll für Dienste, die nach einem Reboot sofort laufen sollen. Achtung: Container startet auch nach docker stop neu, wenn Docker-Daemon neu startet.
unless-stopped
services:
app:
image: nginx
restart: unless-stopped
Beste Wahl für die meisten Homelabs. Container startet nach Reboot neu, aber nicht, wenn er explizit gestoppt wurde.
on-failure
services:
app:
image: mein-app
restart: on-failure
deploy:
restart_policy:
condition: on-failure
delay: 5s
max_attempts: 3
Sinnvoll für Batch-Jobs oder Anwendungen, bei denen Neustarts nach Erfolg nicht erwünscht sind.
no
services:
app:
image: mein-app
restart: "no"
Für einmalige Aufgaben, Tests oder Debugging.
In Compose
services:
web:
image: nginx
restart: unless-stopped
db:
image: postgres
restart: always
Docker Run
docker run -d --name web --restart unless-stopped nginx
Restart-Counter prüfen
docker ps -a
In docker inspect:
docker inspect --format='{{.RestartCount}}' <container>
Endlos-Neustarts vermeiden
- Healthchecks nutzen.
max_attemptssetzen.- Ursache für Fehler finden, statt blind zu wiederholen.
on-failurestattalwaysbei unsicheren Anwendungen.
Beispiel: Datenbank und App
services:
db:
image: postgres:16
restart: always
environment:
POSTGRES_PASSWORD: geheim
volumes:
- db_data:/var/lib/postgresql/data
app:
image: mein-app
restart: unless-stopped
depends_on:
- db
ports:
- "3000:3000"
volumes:
db_data:
Restart nach System-Update
sudo systemctl enable docker
Stellt sicher, dass Docker beim Boot startet, und damit auch Container mit always oder unless-stopped.
Tipps
unless-stoppedals Standard für meiste Dienste.alwaysfür kritische Infrastruktur wie Datenbanken.on-failurefür Jobs, die nicht dauerhaft laufen sollen.- Niemals
alwaysfür kaputte Container, erzeugt Boot-Schleifen. - Logs überwachen, um Neustartgründe zu finden.
depends_onnutzen, um Startreihenfolge zu steuern.
Typische Stolpersteine
- always und trotzdem nicht gestartet: Docker-Daemon läuft nicht beim Boot.
- Endlosschleife: Container stürzt sofort ab,
alwaysstartet neu. - unless-stopped startet doch: System wurde neu gestartet, nicht manuell gestoppt.
- Abhängigkeiten: Datenbank noch nicht bereit, App startet erneut.
- Falscher Exit-Code: Anwendung beendet sich mit 0,
on-failuregreift nicht.
Weiterführende Links und Infos
- BotServ.de Docker Compose
- BotServ.de Docker Healthchecks
- BotServ.de Docker Logs
- BotServ.de Docker Log-Rotation
FAQ: Docker-Container-Neustarts
Was ist der Unterschied zwischen always und unless-stopped?
always startet auch nach docker stop, wenn der Daemon neu startet. unless-stopped startet nicht, wenn der Container zuvor gestoppt wurde.
Startet unless-stopped nach einem Reboot? Ja, solange der Container nicht manuell gestoppt wurde.
Wie verhindere ich Endlos-Neustarts?
on-failure mit max_attempts oder Log-Fehler beheben.
Wann sollte ich no verwenden? Bei einmaligen Jobs, Tests oder Debugging.
Kann ich die Retry-Delay einstellen?
Ja, in Compose mit deploy.restart_policy.delay.
Quellen und weiterführende Literatur
- Docker Restart Policies: https://docs.docker.com/config/containers/start-containers-automatically/
- Compose Restart: https://docs.docker.com/compose/compose-file/05-services/#restart
Zusammenfassung: Docker-Container-Neustarts richtig konfigurieren
Restart-Policies sorgen dafür, dass Container nach Fehlern oder Reboots automatisch wieder laufen. Für die meisten Homelab- und Produktivsetups ist unless-stopped die beste Wahl, da sie Neustarts nach Reboots erlaubt, aber manuelle Stopps respektiert. always ist für kritische Dienste geeignet, on-failure für Batch-Jobs. Wer Endlos-Neustarts vermeiden möchte, sollte Healthchecks, max_attempts und saubere Logs nutzen.


