📦Container: Lebenszyklus, Isolation, Neustarts
Ein Container ist ein Prozess mit Zuständen, eingeschränkter Sicht (Namespaces) und begrenzten Ressourcen (cgroups). Restart-Policies und Healthchecks sorgen dafür, dass er am Laufen bleibt – oder dass man merkt, wenn nicht.
🔄Lebenszyklus
Aktueller Zustand: kein Container · blaue Knöpfe sind im aktuellen Zustand erlaubt.
- Starte mit
docker create.
🛡️Isolation: Namespaces und cgroups
🔭 Namespaces – was sieht wer?
PIDs und Kurz-ID sind Beispielwerte. Nachprüfen: ls -l /proc/<pid>/ns auf dem Host.
🎚️ cgroups v2 – Grenzen für Ressourcen
Namespaces begrenzen, was ein Container sieht – cgroups, wie viel er verbraucht. Docker schreibt die Optionen in Steuerdateien der cgroup.
$ docker run --memory 256m --cpus 1.5 --pids-limit 100 nginx # /sys/fs/cgroup/system.slice/docker-<id>.scope/ memory.max 268435456 memory.swap.max 268435456 ← ohne --memory-swap: gleich viel Swap erlaubt cpu.max 150000 100000 ← Quota/Periode in µs = 1.5 CPUs pids.max 100
- ▸ Überschreitet der Container
memory.max, beendet ihn der OOM-Killer (Exit-Code 137,OOMKilled: true). - ▸
cpu.maxdrosselt: in jeder 100-ms-Periode höchstens 150 ms CPU-Zeit (über alle Kerne). - ▸
pids.maxschützt vor Fork-Bomben. Live-Verbrauch:docker stats.
🔁Restart-Policies
Die Policy greift erst, nachdem der Container einmal erfolgreich lief (mindestens 10 Sekunden). Ein unhealthy-Status löst bei reinem Docker keinen Neustart aus – das tun erst Orchestrierer wie Swarm oder Kubernetes.
🩺Healthchecks
Prüfungen anklicken: ✓ Erfolg → ✗ Fehlschlag → ⏱ zu langsam (länger als timeout).
- t=10s Fehlschlag in der Startphase – zählt nicht.
- t=20s Fehlschlag in der Startphase – zählt nicht.
- t=30s Prüfung erfolgreich (Exit 0).
- t=40s Prüfung erfolgreich (Exit 0).
- t=50s Fehlschlag 1/3.
- t=60s Zeitüberschreitung (7 s > 5 s) – Fehlschlag 2/3.
- t=70s Fehlschlag 3/3.
- t=80s Fehlschlag 4/3.
- t=90s Prüfung erfolgreich (Exit 0).
- t=100s Prüfung erfolgreich (Exit 0).
healthcheck: test: ["CMD", "wget", "-q", "-O", "/dev/null", "http://127.0.0.1:3000/api/health"] interval: 10s timeout: 5s retries: 3 start_period: 30s