DevOps Monitoring Stack: Docker, Prometheus & Grafana [2026]
⚡ Executive Summary: Das 3-Säulen-Fundament für Ausfallsicherheit
-
Zero-Trust Mesh & Private Tailscale Binding: Binden Sie Überwachungs-Ports (Prometheus
9090, Alertmanager9093, Node Exporter9100) niemals an0.0.0.0im offenen Internet. Binden Sie Dienste strikt an Loopback (127.0.0.1) oder verschlüsselte Tailscale-VPN-IPs (100.x.x.x). Der Zugriff auf Dashboards erfolgt abgesichert über ein Caddy Mesh Gateway mit Cloudflare Access JWT-Prüfung. -
TSDB Retention & Volume-Sizing gegen Plattenüberlauf: Ungedrosselte Metriken-Engines füllen Festplatten in Tagen. Definieren Sie in den Prometheus-Flags sowohl Zeit- als auch Speicherdeckel:
--storage.tsdb.retention.time=15dund--storage.tsdb.retention.size=40GB. Kombiniert mit Docker Daemon Log-Rotation (max-size: 50m, max-file: 3) bleibt der Host dauerhaft stabil. -
Intelligente Hysterese & Alert-Deduplizierung: Vermeiden Sie Pager-Müdigkeit durch transiente CPU-Spitzen bei Cronjobs oder Container-Neustarts. Setzen Sie Alertmanager-Regeln mit
for: 3m(Warning) undfor: 5m(Critical) auf Basis von gleitenden Durchschnitten (rate(...[5m])) und bündeln Sie Benachrichtigungen für Slack und PagerDuty.
1. Architektur-Topologie: Multi-Node Telemetrie & Alarmierung
Der weretrade DevOps-Standard trennt Erfassung, Speicherung, Visualisierung und Alarmierung in isolierte, fehlertolerante Ebenen über private VPN-Netzwerke:
2. Production-Pattern: Ready-to-Run docker-compose.monitoring.yml
Der folgende vollständige Compose-Stack initialisiert den gehärteten Monitoring-Verbund mit persistenten Volumes, isoliertem Bridge-Netzwerk, automatischen Healthchecks und striktem Loopback-Binding:
# Production-Ready DevOps Monitoring Stack
# Architecture: Prometheus + Grafana + Node Exporter + cAdvisor + Alertmanager
# Security: Bound to private network & Tailscale mesh; strict TSDB volume caps.
version: '3.8'
networks:
monitoring-net:
driver: bridge
ipam:
config:
- subnet: 172.28.0.0/16
volumes:
prometheus_data:
driver: local
grafana_data:
driver: local
alertmanager_data:
driver: local
services:
# 1. Prometheus Metrics Engine & Time Series Database
prometheus:
image: prom/prometheus:v2.54.1
container_name: devops-prometheus
restart: unless-stopped
user: "65534:65534"
command:
- '--config.file=/etc/prometheus/prometheus.yml'
- '--storage.tsdb.path=/prometheus'
- '--storage.tsdb.retention.time=15d'
- '--storage.tsdb.retention.size=40GB'
- '--web.console.libraries=/usr/share/prometheus/console_libraries'
- '--web.console.templates=/usr/share/prometheus/consoles'
- '--web.enable-lifecycle'
volumes:
- ./prometheus.yml:/etc/prometheus/prometheus.yml:ro
- ./alert_rules.yml:/etc/prometheus/alert_rules.yml:ro
- prometheus_data:/prometheus
networks:
- monitoring-net
ports:
# Expose only on loopback or private Tailnet IP (never 0.0.0.0)
- "127.0.0.1:9090:9090"
healthcheck:
test: ["CMD-SHELL", "wget -q --tries=1 -O- http://localhost:9090/-/healthy || exit 1"]
interval: 15s
timeout: 5s
retries: 3
# 2. Node Exporter (Host Hardware & OS Telemetry)
node-exporter:
image: prom/node-exporter:v1.8.2
container_name: devops-node-exporter
restart: unless-stopped
pid: host
command:
- '--path.procfs=/host/proc'
- '--path.sysfs=/host/sys'
- '--path.rootfs=/rootfs'
- '--collector.filesystem.mount-points-exclude=^/(sys|proc|dev|host|etc)($$|/)'
volumes:
- /proc:/host/proc:ro
- /sys:/host/sys:ro
- /:/rootfs:ro
networks:
- monitoring-net
ports:
- "127.0.0.1:9100:9100"
# 3. cAdvisor (Live Docker Container Performance)
cadvisor:
image: gcr.io/cadvisor/cadvisor:v0.49.1
container_name: devops-cadvisor
restart: unless-stopped
privileged: true
devices:
- /dev/kmsg:/dev/kmsg
volumes:
- /:/rootfs:ro
- /var/run:/var/run:ro
- /sys:/sys:ro
- /var/lib/docker/:/var/lib/docker:ro
- /dev/disk/:/dev/disk:ro
networks:
- monitoring-net
ports:
- "127.0.0.1:8080:8080"
# 4. Grafana Unified Visualization & Dashboards
grafana:
image: grafana/grafana:11.2.0
container_name: devops-grafana
restart: unless-stopped
environment:
- GF_SECURITY_ADMIN_USER=\${GRAFANA_ADMIN_USER:-admin}
- GF_SECURITY_ADMIN_PASSWORD=\${GRAFANA_ADMIN_PASSWORD}
- GF_USERS_ALLOW_SIGN_UP=false
- GF_SERVER_ROOT_URL=https://monitoring.weretrade.com
- GF_INSTALL_PLUGINS=grafana-clock-panel,grafana-piechart-panel
volumes:
- grafana_data:/var/lib/grafana
- ./grafana/provisioning:/etc/grafana/provisioning:ro
networks:
- monitoring-net
ports:
- "127.0.0.1:3000:3000"
depends_on:
prometheus:
condition: service_healthy
# 5. Alertmanager (Notification Deduplication & Slack Routing)
alertmanager:
image: prom/alertmanager:v0.27.0
container_name: devops-alertmanager
restart: unless-stopped
command:
- '--config.file=/etc/alertmanager/alertmanager.yml'
- '--storage.path=/alertmanager'
volumes:
- ./alertmanager.yml:/etc/alertmanager/alertmanager.yml:ro
- alertmanager_data:/alertmanager
networks:
- monitoring-net
ports:
- "127.0.0.1:9093:9093"
3. Performance-Vergleich: Ressourcenbedarf der Monitoring-Komponenten
| Komponente | RAM Footprint | CPU-Last (Idle/Scrape) | Messintervall | Primäre Telemetrie |
|---|---|---|---|---|
| Node Exporter | 15–25 MB | < 0.2% Single-Core | 30s Pull | Host CPU, RAM, Disk I/O, Netzwerk, Filesystem |
| cAdvisor | 40–80 MB | 0.5–1.2% Core | 30s Pull | Container Limits, Throttle, OOM-Events, Docker Socket |
| Prometheus TSDB | 250–600 MB (Head Chunk) | 1–3% Core (Scrape/Rule Eval) | 15–30s Eval | Metriken-Aggregierung, WAL, Komprimierung |
| Grafana v11 | 120–250 MB | < 0.5% (Spitzen bei Rendern) | On-Demand UI | Visualisierung, Provisionierte Dashboards, Auth |
| Alertmanager | 20–35 MB | < 0.1% Core | Ereignisgesteuert | Deduplizierung, Alert-Silence, Slack/Email Webhooks |
4. Häufig gestellte Fragen (DevOps Monitoring FAQ)
Wie sichern wir Prometheus und Node Exporter gegen unbefugten Zugriff im Web ab?
In Produktionsumgebungen darf kein Exporter öffentlich auf 0.0.0.0 lauschen. Node Exporter und cAdvisor binden wir ausschließlich an das interne Docker-Netzwerk oder die private Tailscale-IP (100.x.x.x). Für zentrale Prometheus-Instanzen, die Dashboards bereitstellen, schalten wir einen Caddy Reverse Proxy vor, der Anfragen über Cloudflare Access mit Authentifizierungstoken (mTLS oder OIDC-Session) validiert.
Wie verhindert man False Positives bei nächtlichen Cronjobs und Spike-Workloads?
Kurze CPU- oder I/O-Spitzen sind bei Datenbank-Backups oder Batch-Aufgaben normal. In den Prometheus Alert Rules verwenden wir stets rate(container_cpu_usage_seconds_total[5m]) > 0.85 mit einem expliziten Zeitfenster von for: 5m. Erst wenn die Auslastung über die volle Dauer von 5 Minuten durchgehend überschritten wird, löst der Alertmanager eine Slack-Benachrichtigung aus.
Welche Storage-Engine und Retention-Limits verhindern Festplattenüberlauf?
Prometheus verwendet standardmäßig nur Zeitlimits (15 Tage). Bei stark dynamischen Container-Umgebungen mit hoher Label-Kardinalität kann dies die Festplatte dennoch füllen. Durch das zusätzliche Setzen von --storage.tsdb.retention.size=40GB löscht die TSDB die ältesten Blöcke automatisch, sobald der Speicherdeckel erreicht wird, unabhängig vom Alter der Daten.
Wie lässt sich der Stack für Multi-Host-Umgebungen über WireGuard / Tailscale erweitern?
Über das Tailscale-Mesh-Netzwerk erhält jeder Server eine feste, isolierte IP (z. B. 100.100.10.10). In der zentralen prometheus.yml tragen wir diese Knoten als statische Ziele unter scrape_configs ein. Der Datenverkehr wird durch WireGuard auf Kernel-Ebene Ende-zu-Ende verschlüsselt, ohne dass Firewall-Ports nach außen geöffnet oder komplexe VPN-Gateways eingerichtet werden müssen.
DevOps & Monitoring Stack Audit anfragen
Planen Sie den Aufbau eines hochverfügbaren Observability-Stacks mit Docker, Prometheus, Grafana und automatisiertem Alerting? weretrade IT unterstützt Sie bei Architektur, Hardening und maßgeschneiderten Dashboards.
Unverbindliches Beratungsgespräch anfragen