# Container Storage: Persistenz & Volume Management
TL;DR / Management Summary Ein Container ist flüchtig. Alles, was Sie innerhalb der beschreibbaren Schicht eines Containers speichern, wird beim Löschen der Instanz vernichtet. Für produktive Workloads benötigen wir persistente Speicher. Wir nutzen Docker Volumes (vom Docker-Dienst verwaltet) oder Bind-Mounts (direkte Verknüpfung mit einem Host-Ordner). Ein Senior Admin trennt Code (im Image) strikt von Daten (im Volume) und nutzt Netzwerk-Storage (NFS/Ceph), um Container-Daten über Cluster-Knoten hinweg verfügbar zu machen.
# 1. Das Problem: Ephemeral Storage
Der ‘Goldfisch’-Effekt.
Jeder Container basiert auf einem schreibgeschützten Image. Die Schreib-Ebene obenauf ist:
- Temporär: Wird beim
docker rmgelöscht. - Inperformant: Der “Storage Driver” (overlay2) ist langsamer als direkter Plattenzugriff.
- Isoliert: Andere Container können diese Daten nicht sehen.
# 2. Persistenz-Modelle
Daten retten.
# 1. Bind Mounts
Sie verknüpfen einen Ordner am Host direkt mit einem Pfad im Container.
- Vorteil: Beste Performance. Einfach für Konfigurationsdateien.
- Nachteil: Erfordert exakte Pfad-Strukturen am Host.
docker run -v /etc/mysql/my.cnf:/etc/mysql/my.cnf mysql
# 2. Docker Volumes (Empfohlen)
Der “saubere” Weg. Docker verwaltet einen Bereich unter /var/lib/docker/volumes/.
- Vorteil: Unabhängig vom OS-Pfad des Hosts. Einfach zu sichern.
- Vorteil: Unterstützt Cloud-Treiber (z.B. S3 oder Azure Disk).
docker volume create my_data
docker run -v my_data:/app/data my_app
# 3. Deep Dive: Storage für Datenbanken
IOPS und Konsistenz.
Datenbanken (SQL) sind extrem empfindlich gegenüber Latenz.
- Best Practice: Nutzen Sie für Datenbanken immer Bind-Mounts auf einen performanten ZFS-Dataset (Artikel 683) oder ein XFS-Volume mit aktiver IO-Priorisierung.
- Caching: Deaktivieren Sie das Caching im Docker-Storage-Treiber und überlassen Sie dem Datenbank-Server das direkte Management der Disk-I/O.
# 4. Day-2 Operations: Backup von Volumes
Die Sicherung der Chunks.
Da Volumes oft nur “Ordner” am Host sind:
- Stop Container: Um Dateisperren zu vermeiden.
- Snapshot: Nutzen Sie die ZFS-Snapshot Funktion Ihres Proxmox-Hosts (Artikel 656).
- Backup: Sichern Sie den Ordner
/var/lib/docker/volumes/via Proxmox Backup Server.
# 5. Troubleshooting & “War Stories”
Wenn die Daten ‘verschwinden’.
# Top 3 Fehlerbilder
-
Symptom: “Permission Denied” beim Schreiben ins Volume.
- Ursache: Der User im Container (z.B.
www-datamit UID 33) hat keine Schreibrechte auf dem Host-Ordner. - Lösung:
chown -R 33:33 /pfad/am/host.
- Ursache: Der User im Container (z.B.
-
Symptom: Datenverlust nach Update.
- Ursache: Der Admin vergaß das
-vFlag beim neuendocker runBefehl. Der neue Container startete mit einer leeren Schreib-Ebene.
- Ursache: Der Admin vergaß das
-
Symptom: “Stale File Handle” bei NFS-Volumes.
- Fix: Nutzen Sie NFS v4.1 und prüfen Sie die Locking-Dienste (Artikel 688).
# “War Story”: Der “Auto-Update” Datenkiller
Ein Administrator nutzte ein Script, das nachts alle Container löschte und mit dem neuesten :latest Image startete. Er nutzte Bind-Mounts für die Configs, aber nicht für die User-Uploads.
Das Ereignis: Die Applikation lief nach dem Update einwandfrei.
Das Ergebnis: Erst nach drei Tagen bemerkten die User, dass alle Profilbilder der letzten 6 Monate verschwunden waren. Da sie nur in der flüchtigen Schreib-Ebene des alten Containers lagen, waren sie unwiederbringlich gelöscht.
Lehre: Definieren Sie eine “Persistence Matrix”: Jede App muss dokumentieren, welche Pfade zwingend auf ein Volume gemappt werden müssen.
# 6. Monitoring & Reporting
Füllstände im Blick.
# Docker Disk Usage
Prüfen Sie den Platzverbrauch Ihrer Volumes:
docker system df -v
- KPI:
ACTIVEvsRECLAIMABLE. Löschen Sie ungenutzte Volumes mitdocker volume prune.
# 7. Fazit & Empfehlung
Speicher-Management ist die wichtigste Disziplin für den Betrieb von State-full Apps.
- Empfehlung: Nutzen Sie Namen-basierte Docker Volumes. Sie sind wartungsfreundlicher als absolute Pfad-Mounts.
- Wichtig: Verwenden Sie für hochverfügbare Cluster (Docker Swarm / K8s) einen verteilten Speicher wie Ceph oder Longhorn, damit das Volume mit dem Container zum nächsten Host mitwandern kann.
# Anhang: Cheatsheet (Volume CLI)
| Aufgabe | Befehl |
|---|---|
| Volume erstellen | docker volume create <name> |
| Alle Volumes | docker volume ls |
| Volume Details | docker volume inspect <name> |
| Aufräumen | docker volume prune |