Zurück zum Blog

Docker Umgebung Bereinigung

Docker Umgebung Bereinigung - Performance Optimierung

Docker Umgebung Bereinigung - Performance Optimierung für matzka.cloud

Datum 8. Januar 2026
Kategorie Infrastructure & DevOps
Lesezeit 8 Minuten

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)
Hinweis: Diese Probleme sind normal in produktiven Docker-Umgebungen, die über längere Zeit gewachsen sind. Eine regelmäßige Wartung ist essentiell für Performance und Speichereffizienz.

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%)
⚠️ Kritisch: Der Build-Cache allein verbrauchte 27.77 GB Speicher - praktisch 100% davon war reclaimable!

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

⚠️ Warnung: Der 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
✅ Erfolg: Der gesamte Build Cache wurde gelöscht. Der nächste Build wird den Cache neu aufbauen, was völlig normal ist.

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

✅ Alle 50 aktiven Container laufen unverändert:
  • ✅ 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

✅ 0 Ausfallzeiten: Alle Services waren während der Bereinigung aktiv und erreichbar. Der Prozess ist vollständig nicht-destruktiv und kann jederzeit wiederholt werden.

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
Tipp: Die Docker Daemon Socket-API kann für erweiterte Monitoring-Metriken genutzt werden. Dies ermöglicht Alerting auf Image-Speicher und Container-Health direkt in Prometheus und Grafana.

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 :latest oder 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

✅ Empfohlener Setup:
  • Prometheus mit cAdvisor für Container-Metriken
  • Grafana-Dashboards für Speicherverbrauch
  • AlertManager für Benachrichtigungen (Mail, Slack)
  • Wöchentliche docker system df Reports