Wenn Docker‑Compose über längere Zeit läuft, sammelt sich schnell Ballast an: verwaiste Volumes, ungenutzte Images und veraltete Netzwerke. Ich habe das selbst erlebt: Nach mehreren Projekten auf demselben Host lief der Speicherplatz davon, Backups wurden komplizierter und das Debugging zäher. In diesem Artikel zeige ich dir Schritt für Schritt, wie ich Docker‑Compose aufräume — sicher, kontrolliert und ohne ungewollten Datenverlust.

Warum aufräumen? (und was kann schiefgehen)

Kurz und knapp: Freier Speicherplatz, bessere Übersicht und weniger Überraschungen beim Deploy. Allerdings besteht das Risiko, dass du wichtige Daten löschst, wenn du Volumes oder Images entfernst, die noch gebraucht werden. Besonders bei named volumes (nicht Bind‑Mounts) liegt oft Persistenz von Daten — z. B. Datenbanken oder Uploads — und die versehentliche Löschung kann schwerwiegende Folgen haben.

Sicherheitsprinzipien vorab

Meine Faustregeln bevor ich irgendetwas lösche:

  • Backups anlegen: Volumes sichern, bevor sie entfernt werden.
  • Verifizierte Liste: Erst prüfen, dann löschen — nie blind „prune“ ohne Kontrolle.
  • Rollback-Plan: Wissen, wie man ein Volume wiederherstellt (z. B. aus einem Tar‑Archiv).
  • Testumgebung: Erst auf Staging testen, wenn möglich.
  • Erste Bestandsaufnahme

    Ich starte mit einer Inventur. Die folgenden Kommandos geben mir einen Überblick:

  • docker ps -a — laufende und gestoppte Container.
  • docker images — lokale Images, inklusive dangling Images.
  • docker volume ls — alle Volumes.
  • docker network ls — Netzwerke, auch die von Compose erzeugten.
  • Für Compose‑Stacks verwende ich oft den Compose‑Name als Filter, z. B. docker ps --filter "name=mein_stack", um zu sehen, was zu einem Projekt gehört.

    Volumes prüfen ohne Risiko

    Volumes sind der heikelste Teil. So gehe ich vor, um ihre Bedeutung zu prüfen:

  • Welche Container verwenden ein Volume? Mit docker ps -a --filter volume= oder detaillierter mit docker inspect .
  • Inhalt kurz ansehen: Ich hänge das Volume in einen temporären Container ein, um Inhalte zu prüfen, z. B.:
  • docker run --rm -it -v my_volume:/data busybox sh, dann ls -la /data.
  • Das ist sicher, weil der temporäre Container nichts an den Daten verändert, solange du keine Schreibbefehle ausführst.

    Volumes sichern (Backup)

    Bevor ich lösche, sichere ich Volumes. Zwei einfache Methoden, die ich regelmäßig benutze:

  • Tar‑Backup (klassisch):
  • docker run --rm -v my_volume:/data -v $(pwd):/backup busybox tar cvf /backup/my_volume_2026-02-01.tar /data
  • Rsync über ein temporäres Bind‑Mount (bei großen Datenmengen sinnvoll):
  • Erstelle einen temporären Container mit dem Volume und rsync richte dann zu einem Host‑Pfad — funktioniert gut wenn rsync im Image vorhanden ist.
  • Ich lege das Backup an einem sicheren Ort ab (externes Laufwerk oder S3). So kann ich jederzeit wiederherstellen.

    Volumes löschen — sichere Vorgehensweise

    Nachdem ich sichergestellt habe, dass ein Volume wirklich verwaist ist und gesichert wurde, lösche ich es:

  • docker volume rm my_volume
  • Wenn mehrere Volumes auf einmal weg können, nutze ich gezielte Muster oder Skripte, aber niemals docker volume prune -f ohne vorherige Prüfung. Ich nutze den Prune‑Befehl nur, wenn ich ganz sicher bin und vorher Backups erstellt habe.

    Images aufräumen

    Images brauchen Platz, vor allem sogenannte dangling images („“). Ich nutze:

  • docker images -f "dangling=true" — zur Kontrolle.
  • docker image prune — löscht dangling images.
  • Wenn ich unbenutzte Images komplett entfernen will:

  • docker image prune -a
  • Wichtig: Das entfernt auch Images, die aktuell von keinem Container verwendet werden — eventuell aber später wieder gebraucht werden. Bei kritischen Produktionsumgebungen achte ich darauf, Images über Tags (z. B. myapp:stable) zu verwalten, damit ich reproduzierbare Builds habe.

    Netzwerke bereinigen

    Compose erstellt typischerweise Netzwerke mit dem Projekt‑Prefix. Unbenutzte Netzwerke kannst du mit folgenden Befehlen prüfen und löschen:

  • docker network ls
  • docker network inspect — zeigt verbundene Container.
  • docker network rm
  • Netzwerke sind in der Regel harmlos zu löschen, solange keine Container mehr daran hängen. Ich prüfe immer mit inspect, bevor ich entferne.

    Compose‑spezifische Befehle

    Bei Docker Compose gibt es hilfreiche Flags:

  • docker compose down — stoppt und entfernt Container, aber belässt Volumes.
  • docker compose down --volumes — entfernt auch die von Compose erstellten Volumes (Achtung: Datenverlust möglich).
  • docker compose rm -f — entfernt gestoppte Container.
  • Ich nutze docker compose down --volumes nur, wenn ich sicher bin, dass die Volumes temporär sind oder bereits gesichert wurden. Bei Datenbanken vermeide ich das in Produktionsstacks.

    Systemweit aufräumen

    Wenn ich einen gründlichen Cleanup möchte und weiß, dass alles gesichert ist, verwende ich:

    BefehlWirkung
    docker system pruneEntfernt gestoppte Container, dangling images und ungenutzte Netzwerke.
    docker system prune -aZusätzlich entfernt unbenutzte Images (auch getaggte).
    docker volume pruneEntfernt alle unbenutzten Volumes (Vorsicht!).

    Ich führe diese Befehle interaktiv aus (ohne -f) und lese die Abfrage genau — das hat mich schon oft gerettet.

    Tipps aus der Praxis

  • Labels verwenden: Ich versehe Compose‑Services/Volumes mit Labels wie project=meinprojekt, damit ich später leichter filtern kann.
  • Automatisierte Backups: Regelmäßige Backups z. B. per Cronjob oder GitHub Actions → S3.
  • Dokumentation: Notiere, welche Volumes kritisch sind (z. B. db_data) und warum.
  • Staging‑Aufräumplan: Implementiere Aufräum‑Jobs in Staging, um Löschroutinen zu testen.
  • Wiederherstellung

    Wenn doch mal etwas gelöscht wurde, hilft oft ein Backup‑Tar:

  • docker run --rm -v my_volume:/data -v $(pwd):/backup busybox sh -c "cd /data && tar xvf /backup/my_volume_2026-02-01.tar --strip 1"
  • Oder ich erstelle ein neues Volume und kopiere die Daten zurück. Wichtig ist, dass die Rechte und Besitzer stimmen; bei Datenbanken achte ich zusätzlich auf Konsistenz (z. B. sauberes Dump/Restore statt einfach Kopieren).

    Wenn du magst, kann ich dir ein kurzes Skript zusammenstellen, das die meisten Prüfungen automatisiert (Liste der Volumes mit Anzeige der zugehörigen Container, optionales Backup‑Toggle). Sag mir kurz, welche Distribution/Umgebung du nutzt (Linux, macOS, Docker Desktop) und ob du Compose V1 oder V2 einsetzt — dann passe ich das Skript an.