Docker Umgebung Bereinigung
Docker Umgebung Bereinigung - Performance Optimierung für matzka.cloud
Inhaltsverzeichnis
Das Problem: Speicher-Verschwendung in der Docker-Infrastruktur
Die matzka.cloud Infrastruktur wächst kontinuierlich mit neuen Services wie dem Wazuh SIEM, erweiterten Mini-Games und zusätzlichen Monitoring-Komponenten. Mit dieser Komplexität entstehen unweigerlich Docker-Artefakte, die nicht mehr benötigt werden:
- Dangling Images: Ungetaggte Image-Layer von fehlgeschlagenen oder überholten Builds
- Build Cache: Alte Build-Layer, die für neue Builds nicht mehr relevant sind
- Duplizierte Tags: Mehrere Tags auf dieselben Images (z.B. Redis mit unterschiedlichen Versionen)
- Ungenutzte Images: Test-Images und alte Versionen von Services
- Container-Probleme: Container mit Healthcheck-Fehlern (z.B. authentik-worker)
Analyse: Vor der Bereinigung
Ressourcen-Übersicht
| Ressourcentyp | Anzahl | Größe | Reclaimable |
|---|---|---|---|
| Docker Images | 69 | 70.47 GB | 68.14 GB (96%) |
| Laufende Container | 50 | 133.6 MB | 0 B |
| Volumes | 59 | 12.87 GB | 1.86 MB |
| Build Cache | 195 Layer | 27.77 GB | 27.74 GB (100%) |
Identifizierte Probleme
1. Dangling Images (ungetaggt)
18 ungetaggte Images aus fehlgeschlagenen oder wiederholten Builds der Mini-Games und WebApp Services:
docker image prune -af
# Deleted 25+ untagged images
# Total reclaimed space: 421.8 MB
2. Duplizierte und alte Versions-Tags
| Image | Tags | Status |
|---|---|---|
| qdrant/qdrant | v1.16.3 + latest (identisch) | Dupliziert |
| redis | 7-alpine + 7.4.6-alpine | Dupliziert |
| gcr.io/cadvisor | v0.51.0 + latest | Dupliziert |
| traefik | v2.11 (aktiv) + v3.2 (alt) | Ungenutzt |
| n8nio/n8n | latest (aktiv) + 1.73.1 (alt) | Ungenutzt |
3. Test & Utility Images
hello-world:latest- 25.9 kB (nur für Tests)curlimages/curl:latest- 33.6 MB (nicht mehr benötigt)wazuh/wazuh-certs-generator:0.0.3- 419 MB (nur für Init)alpine:latest- nicht direkt verwendet
4. Container Health Issues
authentik-worker Container zeigte Status unhealthy,
obwohl die Logs normal waren. Dies deutet auf einen Healthcheck-Timeout hin.
Bereinigungsprozess
Schritt 1: Dangling Images entfernen
ssh root@ssh2.matzka.cloud "docker image prune -af"
# Output:
# Deleted 25+ untagged image layers
# Total reclaimed space: 421.8MB
Mit dem -af Flag werden alle ungetaggten Images ohne Nachfrage gelöscht.
Dies ist sicher, da diese Images nicht in use sind.
Schritt 2: Build Cache bereinigen
ssh root@ssh2.matzka.cloud "docker builder prune -af"
# Output:
# Deleted build cache layers
# Total reclaimed space: 27.74GB
Schritt 3: Container Health prüfen & reparieren
ssh root@ssh2.matzka.cloud "docker logs authentik-worker --tail 30"
# Logs zeigen: Alle Tasks laufen erfolgreich
ssh root@ssh2.matzka.cloud "docker restart authentik-worker"
# Container startet neu und wird wieder healthy
Schritt 4: Finale Verifizierung
ssh root@ssh2.matzka.cloud "docker system df"
# Nach Bereinigung:
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 44 44 41.08GB 41.08GB (100%)
Containers 50 50 133.7MB 0B (0%)
Local Volumes 59 45 12.87GB 1.865MB (0%)
Build Cache 0 0 0B 0B
Ergebnisse & Einsparungen
Speicher-Statistik
| Metrik | Vorher | Nachher | Einsparung |
|---|---|---|---|
| Docker Images | 69 | 44 | 25 Images (-36%) |
| Image Speicher | 70.47 GB | 41.08 GB | ~29.4 GB (-42%) |
| Build Cache | 27.77 GB | 0 B | 27.77 GB (-100%) |
| Dangling Images | 1.4 GB | 0 B | 1.4 GB (-100%) |
| Gesamt freigegebener Speicher | ~29.8 GB | -42% | |
Beibehaltene aktive Services
- ✅ 18 Mailcow Container (Mail-Service)
- ✅ 3 Wazuh SIEM Container (Security Monitoring)
- ✅ Authentik SSO (Fixed: authentik-worker now healthy)
- ✅ Nextcloud + PostgreSQL + Redis
- ✅ Directus CMS + PostgreSQL
- ✅ n8n Automation + Qdrant Vector DB
- ✅ WebApp (Next.js 16) + Mini-Games
- ✅ Traefik Reverse Proxy
- ✅ Monitoring Stack (Prometheus, Grafana, Node-Exporter)
- ✅ Umami Analytics
Keine Ausfallzeiten
Wartung & kontinuierliches Monitoring
Automatisierte Bereinigung mit Cronjob
Zur Vermeidung zukünftiger Speicher-Probleme kann eine automatisierte Bereinigung eingerichtet werden:
# In /opt/docker/compose/cron/docker-cleanup.sh
#!/bin/bash
echo "Docker cleanup started at $(date)" >> /var/log/docker-cleanup.log
# Dangling images entfernen
docker image prune -af --filter "until=720h" \
>> /var/log/docker-cleanup.log 2>&1
# Build cache bereinigen (älter als 7 Tage)
docker builder prune -af --filter "unused-for=7d" \
>> /var/log/docker-cleanup.log 2>&1
# System-wide cleanup
docker system prune -af --volumes --filter "until=30d" \
>> /var/log/docker-cleanup.log 2>&1
echo "Docker cleanup completed at $(date)" >> /var/log/docker-cleanup.log
Diese Scripts sollte dann via Cronjob wöchentlich ausgeführt werden:
# /etc/cron.d/docker-cleanup (auf ssh2.matzka.cloud)
# Wöchentliche Docker-Bereinigung sonntags um 03:00 UTC
0 3 * * 0 root /opt/docker/compose/cron/docker-cleanup.sh
Monitoring des Speicherverbrauchs
| Metrik | Warnschwelle | Kritisch | Prüffrequenz |
|---|---|---|---|
| Docker Image Space | >60 GB | >80 GB | Täglich |
| Build Cache | >10 GB | >20 GB | Wöchentlich |
| Dangling Images | >1 GB | >5 GB | Wöchentlich |
| Container Health | Unhealthy Container | Multiple unhealthy | Stündlich (Prometheus) |
Prometheus Metrics für Docker
# In /opt/docker/monitoring/prometheus/docker-targets.yml
# Docker System Metrics
scrape_configs:
- job_name: 'docker-system'
static_configs:
- targets: ['localhost:9323'] # Docker Daemon Socket
metrics_path: '/metrics'
- job_name: 'docker-container-health'
static_configs:
- targets: ['localhost:9100']
relabel_configs:
- source_labels: [__meta_docker_container_health]
regex: 'unhealthy'
action: keep
Best Practices für Docker-Umgebungen
1. Regelmäßige Bereinigung durchführen
Keine selten Bilder, Volumes oder Container bleiben: Setzen Sie einen wöchentlichen Reinigungsprozess auf.
# Wöchentliche Bereinigung
docker image prune -a --filter "until=720h" -f
docker volume prune -f
docker network prune -f
2. Image-Namen und Tags konsistent halten
- Immer
:latestoder spezifische Versionstags verwenden, niemals ungetaggte Images - Alte Versionstags nach Verwendung aufräumen
- In Production: Spezifische Versionstags verwenden (z.B.
postgres:17.1-alpine, nicht:latest)
3. Build Cache Manager nutzen
# Dockerfile BuildKit für bessere Cache-Kontrolle
# DOCKER_BUILDKIT=1 docker build --cache-from=type=registry,ref=... .
4. Volumes explizit verwalten
Docker Umgebung Bereinigung
# Nur reclaimable Volumes löschen
docker volume prune --filter "label!=keep"
# Named Volumes mit Labels versehen
docker volume create --label="keep=true" postgres_data
5. Health-Checks konfigurieren
# In docker-compose.yml
services:
authentik-worker:
image: ghcr.io/goauthentik/server:latest
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 30s
timeout: 5s
retries: 3
start_period: 40s
6. Monitoring & Alerting
- Prometheus mit cAdvisor für Container-Metriken
- Grafana-Dashboards für Speicherverbrauch
- AlertManager für Benachrichtigungen (Mail, Slack)
- Wöchentliche
docker system dfReports