Perfekt! Dann bauen wir jetzt Schritt-für-Schritt ein übersichtliches Grafana-Dashboard für Docker-Hosts, mit allen wichtigen Metriken:

laufende Container pro Host

CPU pro Container

RAM pro Container

Netzwerk pro Container

Container-Status

Alles für Grafana 12.0.3 + InfluxDB 1.x + Telegraf 1.37.x.

Schritt 1: Dashboard erstellen

Grafana → Dashboards → New → New Dashboard

Klicke Add new panel (Panel wird später angepasst)

Titel: Docker Übersicht (optional)

Temporär Query leer lassen

Dashboard speichern (später befüllen)

Schritt 2: Template-Variable für Host

Damit kannst du zwischen mehreren Docker-Hosts filtern:

Dashboard → Settings (Zahnradsymbol) → Variables → Add variable

Name: Host

Type: Query

Data source: InfluxDB

Query:

SHOW TAG VALUES FROM "docker_container_status" WITH KEY = "host"


Multi-value: ON

Include All option: ON

Speichern

✅ Jetzt kannst du den Host auswählen.

Schritt 3: Template-Variable für Container

Optional, falls du einzelne Container filtern willst:

Variable Name: container

Query:

SHOW TAG VALUES FROM "docker_container_cpu" WITH KEY = "container_name"


Multi-value: ON

Include All option: ON

Speichern

Schritt 4: Panel „Laufende Container pro Host“

Add Panel → Stat

Titel: Running Containers

Query (InfluxQL):

SELECT count("container_status")
FROM "docker_container_status"
WHERE "container_status" = 1
  AND "host" =~ /^$Host$/
  AND $timeFilter
GROUP BY time($__interval)


Optional: Value mappings:

0 → 🔴

>=1 → 🟢

✅ Zeigt aktuelle Anzahl laufender Container.

Schritt 5: CPU-Panel pro Container

Add Panel → Time series

Titel: CPU Usage (%)

Query:

SELECT mean("usage_percent")
FROM "docker_container_cpu"
WHERE "container_name" =~ /^$container$/ AND "host" =~ /^$Host$/ AND $timeFilter
GROUP BY time($__interval), "container_name"
fill(null)


Unit: percent

Panel speichern

Schritt 6: RAM-Panel
a) RAM in Bytes
SELECT mean("usage")
FROM "docker_container_mem"
WHERE "container_name" =~ /^$container$/ AND "host" =~ /^$Host$/ AND $timeFilter
GROUP BY time($__interval), "container_name"
fill(null)


Unit: bytes

b) RAM in Prozent
SELECT mean("usage_percent")
FROM "docker_container_mem"
WHERE "container_name" =~ /^$container$/ AND "host" =~ /^$Host$/ AND $timeFilter
GROUP BY time($__interval), "container_name"
fill(null)


Unit: percent

Schritt 7: Netzwerk-Panel
a) RX (empfangen)
SELECT non_negative_derivative(mean("rx_bytes"),1s)
FROM "docker_container_net"
WHERE "container_name" =~ /^$container$/ AND "host" =~ /^$Host$/ AND $timeFilter
GROUP BY time($__interval), "container_name"
fill(null)

b) TX (gesendet)
SELECT non_negative_derivative(mean("tx_bytes"),1s)
FROM "docker_container_net"
WHERE "container_name" =~ /^$container$/ AND "host" =~ /^$Host$/ AND $timeFilter
GROUP BY time($__interval), "container_name"
fill(null)


Unit: Bps

Schritt 8: Container-Status-Panel

Add Panel → Stat

Titel: Container Status

Query:

SELECT last("container_status")
FROM "docker_container_status"
WHERE "container_name" =~ /^$container$/ AND "host" =~ /^$Host$/ AND $timeFilter


Value mappings:

1 → Running 🟢

0 → Stopped 🔴

Schritt 9: Alerts einrichten
a) Container down

Panel: Container Status

Alert condition: last() < 1 for 1 minute

b) RAM > 90 %

Panel: Memory Usage (%)

Alert condition: avg() > 90 for 2 Minuten

c) CPU > 80 %

Panel: CPU Usage (%)

Alert condition: avg() > 80 für 5 Minuten

Schritt 10: Dashboard layout

Empfohlenes Layout:

Docker Übersicht (Dashboard)
├─ Template Variables: Host, Container
├─ Running Containers (Stat)
├─ CPU Usage (%) (Time series)
├─ Memory Usage (%) (Time series)
├─ Memory Usage (Bytes)
├─ Network RX (Time series)
├─ Network TX (Time series)
└─ Container Status (Stat)


Wenn du willst, kann ich dir jetzt noch eine fertige Schritt-für-Schritt Anleitung für die optimale Panel-Größe & Positionierung geben, sodass dein Dashboard übersichtlich & kompakt ist – perfekt für mehrere Hosts.

Willst du, dass ich das mache?