docker stats - Ressourcenverbrauch von Containern in Echtzeit überwachen

docker stats - Ressourcenverbrauch von Containern in Echtzeit überwachen

docker stats zeigt in Echtzeit, was jeder Container gerade verbraucht — der schnellste Weg, um einen auffälligen Container zu finden.

Grundnutzung

docker stats                          # Alle laufenden Container, live aktualisiert
docker stats --no-stream              # Einmalige Momentaufnahme
docker stats myapp db redis           # Nur bestimmte Container
docker stats --no-stream --all        # Auch gestoppte Container

Die Spalten erklärt

CONTAINER ID   NAME       CPU %   MEM USAGE / LIMIT     MEM %   NET I/O         BLOCK I/O        PIDS
a3b2c1d4e5f6   myapp      2.34%   128MiB / 512MiB       25.00%  1.2MB / 800kB   12MB / 4MB       18

| Spalte | Bedeutung |
|---|---|
| CPU % | CPU-Anteil relativ zu allen Kernen. 100% = 1 voller Kern |
| MEM USAGE / LIMIT | Aktueller RAM-Verbrauch / konfiguriertes Limit (oder Host-RAM) |
| MEM % | RAM-Verbrauch als Prozentsatz des Limits |
| NET I/O | Netzwerkdurchsatz: empfangen / gesendet |
| BLOCK I/O | Disk-I/O: gelesen / geschrieben |
| PIDs | Anzahl laufender Prozesse im Container |

Wichtig bei CPU %: Auf einem 4-Kern-Host kann ein Container theoretisch bis zu 400 % erreichen (alle Kerne ausgelastet). --cpus="1.0" begrenzt auf 100 %.

Format anpassen

docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}\t{{.MemPerc}}"

Nur Namen und CPU:

docker stats --no-stream --format "{{.Name}}: {{.CPUPerc}}"

Alle verfügbaren Felder:

.ID, .Name, .CPUPerc, .MemUsage, .MemPerc, .NetIO, .BlockIO, .PIDs

Nützliche One-Liner

Hungrigs Container nach CPU sortiert:

docker stats --no-stream --format "{{.CPUPerc}}\t{{.Name}}" | sort -rn | head -5

Container nach RAM sortiert:

docker stats --no-stream --format "{{.MemUsage}}\t{{.Name}}" | sort -rh | head -5

Gesamt-Ressourcen aller Container:

docker stats --no-stream --format "{{.CPUPerc}}" | awk '{sum += $1} END {print "Gesamt CPU:", sum "%"}'

docker top: Prozesse im Container

Wo docker stats den Container als Ganzes zeigt, zeigt docker top die einzelnen Prozesse darin:

docker top myapp           # Prozess-Liste (wie ps aux)
docker top myapp -eo pid,pcpu,pmem,comm   # Bestimmte Spalten

| Befehl | Zeigt |
|---|---|
| docker stats | Ressourcen auf Container-Ebene |
| docker top | Prozesse innerhalb eines Containers |
| docker exec myapp ps aux | Dasselbe wie top, aber aus Container-Sicht |

Monitoring-Integration

Für dauerhafte Überwachung docker stats per Cron als Snapshot:

# /etc/cron.d/docker-stats-snapshot
*/5 * * * * root docker stats --no-stream --format "{{.Name}},{{.CPUPerc}},{{.MemUsage}}" >> /var/log/docker-stats.csv

Professioneller: cAdvisor exportiert Metriken für Prometheus:

services:
  cadvisor:
    image: gcr.io/cadvisor/cadvisor:latest
    volumes:
      - /:/rootfs:ro
      - /var/run:/var/run:ro
      - /sys:/sys:ro
      - /var/lib/docker:/var/lib/docker:ro
    ports:
      - "8080:8080"

OOM-Erkennung

Wenn MEM % dauerhaft über 90 % liegt und der Container mit Exit 137 abstürzt, hat der OOM-Killer zugeschlagen:

docker inspect --format='{{.State.OOMKilled}}' myapp   # true = OOM
docker events --filter event=oom                        # Live OOM-Events

docker stats liefert in Sekunden die Information, die man zur Fehleranalyse und Kapazitätsplanung braucht — und das ohne zusätzliche Tools.