Letzte Aktualisierung am 1. Juni 2025

Im ersten Schritt kümmern wir uns um die Installation von Prometheus und NodeExporter in der bestehenden Docker-Umgebung. Prometheus ist ein Tool, das Metrik-Daten aus unterschiedlichen Quellen sammelt und zentral bereitstellt. Diese zentrale Bereitstellung nutzen wir später in Grafana für die Auswertung und Visualisierung.
Ich verwende für die Quellcodeablage Gitea als Repository und Portainer für die Verwaltung der Docker-Umgebung, insb. für das Anlegen von Docker-Netzwerken und die Nutzung von Stacks für die docker-compose.yml. Wie ich diese Umgebung aufgesetzt habe, beschreibe ich in Raspberry Pi, Docker, NAS und mehr…
Prometheus und NodeExporter auf deinem Pi
docker-compose.yml und .env
Prometheus und NodeExporter werden als Docker-Container in eigenen Stack aufgesetzt. Für die Dateien docker-compose.yml
und .env
legst du ein neues Repository unter Gitea anlegen. Ich verwenden im folgenden das Repository metrics
.
Ich verwende im Repository metrics
folgende Verzeichnisstruktur.

Die Dateien docker-compose.yml
und .env
für Prometheus sind unter build/prometheus
abgelegt. In diesen beiden Dateien musst du folgende Änderungen vornehmen, um sie an deine Bedürfnisse anzupassen:
- docker-compose.yml
- Zeile 16:
Hier definierst du den Port, über den der Container für NodeExporter zu erreichen ist. Wenn es zu deinen bisherigen Port-Belegungen passt, kannst du den Port 9100 so belassen. - Zeile 18:
Hier gibst du das Docker-Netzwerk an, in dem sich die NodeExporter-Instanz befindet. Dieses Netzwerk ist dasselbe, in dem sich bereits der Prometheus-Container befindet. - Zeile 20:
Hier wird das Label für Watchtower definiert, damit eine automatische Aktualisierung von NodeExpoter über Watchtower erfolgt. Wenn du kein Watchtower benutzt, kannst du das Label bzw. den ganzenlabels
-Abschnitt weglassen. - Zeilen 27-28:
Diese beiden Zeilen sorgen dafür, dass die Daten des Prometheus-Containers in deiner Datenablage im Verzeichnis monitor/prometheus abgelegt werden. Um die in Zeile 27 angegebene Datei prometheus.yml kümmern wir uns später im Abschnitt - Zeile 36
Hier definierst du den Port, über den deine Prometheus-Instanz zu erreichen ist. Wenn es zu deinen bisherigen Port-Belegungen passt, kannst du den Port 9090 so belassen. - Zeile 38
Hier gibst du das Docker-Netzwerk an, in dem sich die Prometheus-Instanz befindet. Darin wird weiter unter auch der NodeExporter eingefügt. - Zeile 40
Hier wird das Label für Watchtower definiert, damit eine automatische Aktualisierung von Prometheus über Watchtower erfolgt. Wenn du kein Watchtower benutzt, kannst du das Label bzw. den ganzenlabels
-Abschnitt weglassen. - Zeile 43-45
Imnetworks
-Abschnitt wird das in Zeile 18 angegebene Netzwerk als externes Netzwerk deklariert. Bevor du einen Stack für Prometheus startest, musst du dieses Netzwerk in Portainer anlegen.
- Zeile 16:
- .env
- Zeile 5:
Hier ergänzt du das Share für deine Datenablage, die du beim Aufsetzen deines Pi eingerichtet hast.
- Zeile 5:
docker-compose.yml
services:
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
ports:
- 9100:9100
networks:
- nw-dekayone-monitor
labels:
- com.centurylinklabs.watchtower.enable=true
prometheus:
image: prom/prometheus:latest
container_name: prometheus
restart: unless-stopped
volumes:
- ${DATA_ROOT}/monitor/prometheus/config/prometheus.yml:/etc/prometheus/prometheus.yml
- ${DATA_ROOT}/monitor/prometheus/data:/prometheus
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--web.console.libraries=/etc/prometheus/console_libraries'
- '--web.console.templates=/etc/prometheus/consoles'
- '--web.enable-lifecycle'
ports:
- 9090:9090
networks:
- nw-dekayone-monitor
labels:
- com.centurylinklabs.watchtower.enable=true
networks:
nw-dekayone-monitor:
external:
true
.env
# timezone
TIMEZONE=Europe/Berlin
# mountpoint of persistent data storage on NAS
DATA_ROOT=dein_datenablage_share
Nachdem du deine Änderungen vorgenommen hast, kannst du Änderungen mit einem „Commit und Push“ ins Repository metrics befördern.
prometheus.yml
Die Verbindung von Prometheus zu den einzelnen Instanzen wie NodeExporter zum Sammeln der Metrik-Daten funktioniert nicht automatisch. Für diese Verbindung sorgt eine Konfigurationsdatei prometheus.yml
, die wir in diesem Kapitel anlegen.
Ich habe die Datei prometheus.yml
im config
-Ordner des Repositories angelegt und habe damit eine Änderungsverfolgung. Die Datei wird während des Deployment des Stacks in Portainer nicht automatisch verwendet, sie muss vor dem Deployment im richtigen Verzeichnis deiner Datenablage vorhanden sein. Dazu ist etwas Handarbeit in der Konsole deines Pi notwendig.
Es ist aus meiner Sicht am einfachsten mit der Konsole des Pi die Konfigurationsdatei anzulegen. Dazu loggst du dich über ssh in der Konsole ein und legst zunächst das Verzeichnis config
in deiner Datenablage ein. Dieses Verzeichnis ist das Verzeichnis, dass im docker-compose.yml
für den Service prometheus
für die Datei prometheus.yml
angegeben ist. Ich verwende hier die Umgebungsvariable ${DATA_ROOT}
, die wie bei der Einrichtung der Datenablage beschrieben angelegt ist. Im Verzeichnis erstellst du mit nano die Datei prometheus.yml
.
mkdir -p ${DATA_ROOT}/monitor/prometheus/config
nano ${DATA_ROOT}/monitor/prometheus/config/prometheus.yml
Für den Inhalt der Datei prometheus.yml verwendest du das folgende Beispiel, das du deinen Bedürfnissen anpassen musst.
- Abschnitt
global
Hier werden die Intervalle zum Sammeln und Auswerten der Daten auf 30s gesetzt. Die Intervallzeiten kannst du hier deinen Bedürfnissen anpassen. - Abschnitte
scrape_configs
In diesem Abschnitt erfolgt die Verbindung von Prometheus und NodeExporter durch sog. Jobs. Jeder dieser Jobs beginnt mit der Zeile- job_name:
und dahinter einem beliebigen Namen.
Hier sind die beiden Jobs für Prometheus selbst und den installierten NodeExporter definiert. Wichtig ist in beiden Jobs die Angabe derstatic_configs
mit den entsprechenden IP-Adressen. Hier steht in beiden Fällen die IP-Adresse deines Pi gefolgt vom Port 9090 für Prometheus bzw. Port 9100 für NodeExporter analog den Angaben in der docker-compose.yml.
prometheus.yml
global:
scrape_interval: 30s
evaluation_interval: 30s
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 30s
static_configs:
- targets: ['192.168.1.222:9090']
- job_name: 'dk2docker'
static_configs:
- targets: ['192.168.1.222:9100']
nano beendest du mit Strg + x und beantwortest die Nachfrage zum Speichern mit J (bzw. y), sodass deine Änderungen in der Datei prometheus.yml
gespeichert werden.
Stack erstellen und starten
Bevor du das Repository nun nutzt für einen neuen Stack monitoring, musst du in Portainer das Docker-Netzwerk nw-dekayone-monitor (bzw. den Namen, den du verwendest) anlegen.

Jetzt kannst du den Stack monitoring in Portainer mit der Verbindung zum Repository metrics erstellen (siehe z.B. hier für ausführlicheres Beispiel für die Nutzung eines Stacks). Nach erfolgreichem Start des Stacks monitoring findest du darin die beiden Container für Prometheus und NodeExplorer.

Damit haben wir den ersten Schritt erledigt und die zentrale Sammelinstanz für die Metrik-Daten installiert, die auch die ersten Daten einsammelt. Das kannst du dir in der Prometheus-GUI anschauen, die du über die Eingabe der IP-Adresse deines Pi gefolgt vom Port 9090 in einem Internet Browser eingibst.

Die eingerichteten Datenlieferanten für Prometheus (Targets) wie z.B. NodeExporter findest du in der Prometheus-GUI unter dem Punkt Status | Target Health. Es wird die eine Auflistung aller Datenlieferanten gezeigt, die du in der Datei prometheus.yml
als Job angelegt hast.

Wenn du auf einen Link klickst, werden die gesammelten Daten in ihrer Rohform angezeigt.

Nun haben wir eine Menge Daten, deren Auswertung und Interpretation in dieser Rohform nicht sinnvoll machbar ist. Dafür werden wir im nächsten Abschnitt Grafana installieren, um darin die Datenauswertung zu visualisieren.
NodeExporter Standalone
Wenn du weitere Pi’s in deinem LAN betreibst, kannst du auf ihnen NodeExporter als Docker-Container installieren, um auch von den weiteren Pi’s Betriebsdaten zu sammeln. Dazu verwendest du die docker-compose.yml aus dem vorangegangenen Abschnitt als Basis und legst die Datei im Repository metrics unter build/node-exporter ab. Eine .env-Datei wird nicht benötigt
In folgenden Zeilen musst du evtl. Änderungen vornehmen, um deine Bedürfnisse abzudecken:
- Zeile 16:
Hier definierst du den Port, über den der Container für NodeExporter zu erreichen ist. Wenn es zu deinen bisherigen Port-Belegungen passt, kannst du den Port 9100 so belassen. - Zeile 18:
Hier gibst du das Docker-Netzwerk an, in dem sich die NodeExporter-Instanz befindet. Dieses Netzwerk ist dasselbe, in dem sich bereits der Prometheus-Container befindet. - Zeile 20:
Hier wird das Label für Watchtower definiert, damit eine automatische Aktualisierung des Containers über Watchtower erfolgt. Wenn du kein Watchtower benutzt, kannst du das Label bzw. den ganzenlabels
-Abschnitt weglassen.
docker-compose.yml
services:
node-exporter:
image: prom/node-exporter:latest
container_name: node-exporter
restart: unless-stopped
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
command:
- '--path.procfs=/host/proc'
- '--path.rootfs=/rootfs'
- '--path.sysfs=/host/sys'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
ports:
- 9100:9100
networks:
- nw-dekayone-monitor
labels:
- com.centurylinklabs.watchtower.enable=true
networks:
nw-dekayone-monitor:
external:
true
Nach der Anpassung überträgst du die Änderungen mit einem „Commit and push“ ins Repository metrics. Jetzt kannst du in Portainer die Docker-Umgebung eines weiteren Pi aufrufen, um dort mit der Verbindung zum Repository metrics eine Standalone-NodeExporter als Stack zu starten.
Damit die eingesammelten Daten deines weiteren Pi auch in Prometheus landen, musst du die Datei prometheus.yml
um einen neuen Job ergänzen und den Stack monitoring mit Prometheus neu starten. Du kannst dazu einfach den bestehenden Job für den ersten NodeExporter kopieren und mit geändertem Namen und angepasster IP-Adresse einfügen (Zeilen 15-17). Anschließend findest du in der Prometheus-GUI den neue eingerichteten Job unter den Targets.
Erweiterung prometheus.yml
global:
scrape_interval: 30s
evaluation_interval: 30s
scrape_configs:
- job_name: 'prometheus'
scrape_interval: 30s
static_configs:
- targets: ['192.168.1.222:9090']
- job_name: 'dk2docker'
static_configs:
- targets: ['192.168.1.222:9100']
- job_name: 'dk3docker'
static_configs:
- targets: ['192.168.1.223:9100']
Quellen
- Prometheus
https://prometheus.io
https://hub.docker.com/r/prom/prometheus/
Dokumentation
https://prometheus.io/docs/introduction/overview/ - NodeExporter
https://github.com/prometheus/node_exporter
Dokumentation zur Integration in Prometheus
https://prometheus.io/docs/guides/node-exporter/ - Grafana-Dokumentation für Nutzung von Prometheus und NodeExporter
https://grafana.com/docs/grafana-cloud/send-data/metrics/metrics-prometheus/prometheus-config-examples/docker-compose-linux/
https://easycode.page/monitoring-on-raspberry-pi-with-node-exporter-prometheus-and-grafana/