Wie Docker-Speicher funktioniert: Volumes vs Bind Mounts
Einführung
In diesem Tutorial lernen Sie, wie Docker-Speicher funktioniert und wie Sie Daten mit Docker-Volumes und Bind-Mounts persistent speichern können. Sie verstehen auch die wesentlichen Unterschiede zwischen diesen Ansätzen und wann Sie jeden in der Produktion verwenden sollten. Dies hilft Ihnen, Datenverlust zu vermeiden und zuverlässige containerisierte Systeme zu entwerfen.
Voraussetzungen
- Zielgruppe: Anfänger-Systemadministratoren
- Geschätzte Zeit: ~30 Minuten
- Betriebssystem: Jedes OS mit Docker-Unterstützung wie Ubuntu 22.04+, Debian 12+, CentOS Stream oder macOS mit Docker Desktop
- Software: Docker 24.0.0 oder neuer
- Berechtigungen: Benutzer mit Zugriff auf Docker oder sudo-Rechte
- Hardware: Mindestens 2 GB RAM und 10 GB freier Speicherplatz
- Netzwerk: Internetzugang zum Herunterladen von Container-Images
- Vorausgesetztes Wissen: Grundlegende Befehlszeilenbenutzung und Verständnis von Containern
Schritt 1: Verstehen, wie Docker-Speicher funktioniert
Docker-Container verwenden ein geschichtetes Dateisystem. Jeder Container hat eine beschreibbare Schicht über den schreibgeschützten Image-Schichten.
Was passiert, wenn ein Container Daten schreibt
- Docker speichert Image-Schichten als schreibgeschützt
- Wenn Sie einen Container starten, fügt Docker eine beschreibbare Schicht hinzu
- Alle Dateiänderungen erfolgen nur in dieser beschreibbaren Schicht
Ergebnis
Wenn Sie einen Container löschen, gehen alle Daten in der beschreibbaren Schicht verloren. Das bedeutet, dass der Container-Speicher standardmäßig flüchtig ist.
Dieses Verhalten ist nützlich für zustandslose Anwendungen, aber nicht für Datenbanken oder persistente Dienste.
Schritt 2: Erstellen und Verwenden von Docker-Volumes
Docker-Volumes sind von Docker erstellte und verwaltete Speicherorte.
Ein Volume erstellen
Führen Sie den folgenden Befehl aus:
docker volume create my_volume
Sie sollten den Volumen-Namen zurückgegeben sehen.
Ein Volume in einem Container verwenden
Führen Sie den folgenden Befehl aus:
docker run -d -v my_volume:/app/data --name volume_test busybox
Docker bindet das Volume im Container unter /app/data ein.
Ergebnis
Daten, die in /app/data geschrieben werden, bleiben erhalten, auch wenn der Container entfernt wird.
Wesentliche Merkmale von Volumes
- Von Docker verwaltet
- In Docker-internen Verzeichnissen wie
/var/lib/docker/volumes/gespeichert - Einfach zu sichern und zu migrieren
- Isoliert von der Host-Dateisystemstruktur
Verwenden Sie Volumes für Datenbanken und Produktions-Workloads.
Schritt 3: Erstellen und Verwenden von Bind-Mounts
Bind-Mounts verknüpfen ein bestimmtes Verzeichnis auf dem Host mit einem Verzeichnis im Container.
Ein Bind-Mount verwenden
Führen Sie den folgenden Befehl aus:
docker run -d -v /home/<YOUR_USERNAME>/data:/app/data --name bind_test busybox
Ergebnis
Der Container greift direkt auf das Host-Verzeichnis zu. Alle Änderungen im Host-Verzeichnis sind sofort im Container sichtbar.
Wesentliche Merkmale von Bind-Mounts
- Abhängig von Host-Dateisystempfaden
- Erlauben direkte Dateibearbeitung vom Host
- Keine von Docker verwaltete Isolation
- Flexibler, aber weniger portabel
Bind-Mounts spiegeln Änderungen sofort zwischen Host und Container wider.
Schritt 4: Vergleich von Volumes und Bind-Mounts
Das Verständnis der Unterschiede hilft Ihnen, die richtige Option zu wählen.
Docker-Volumes
- Von Docker verwaltet
- Portabel über Umgebungen hinweg
- Sicherer für den Produktionseinsatz
- Einfacher zu sichern
- Abstrahiert vom Host-Dateisystem
Bind-Mounts
- Vom Host verwaltet
- An spezifische Dateisystempfade gebunden
- Nützlich für die Entwicklung
- Bieten direkten Dateizugriff
- Weniger sicher, wenn falsch konfiguriert
Schritt 5: Auswahl zwischen Volumes und Bind-Mounts in der Produktion
Verwenden Sie die folgenden Richtlinien.
Wann Docker-Volumes verwenden
- Ausführen von Datenbanken wie MySQL oder PostgreSQL
- Speichern von Anwendungsdaten, die erhalten bleiben müssen
- Bereitstellen von Produktionsdiensten
- Portabilität über Server hinweg benötigen
Wann Bind-Mounts verwenden
- Lokale Entwicklungsumgebungen
- Direktes Bearbeiten von Code- oder Konfigurationsdateien
- Debuggen von Containerverhalten
- Temporäre oder Test-Setups
Wichtig: Bind-Mounts können sensible Host-Dateien für Container zugänglich machen, wenn sie falsch konfiguriert sind. Überprüfen Sie immer Pfade und Berechtigungen.
Verifizierung und Testen
Erstellen Sie einen Test-Container mit einem Volume:
docker run -it -v my_volume:/data --name playground busybox
Erstellen Sie innerhalb des Containers eine Datei:
echo test > /data/file.txt
Beenden Sie den Container und entfernen Sie ihn:
docker rm -f playground
Starten Sie einen neuen Container mit demselben Volume:
docker run -it -v my_volume:/data --name playground busybox
Überprüfen Sie die Datei:
cat /data/file.txt
Erwartetes Ergebnis: Die Datei existiert noch, was die Datenpersistenz bestätigt.
Änderungen rückgängig machen
Um Ressourcen zu bereinigen, führen Sie die folgenden Befehle aus:
docker rm -f playground volume_test bind_test
docker volume rm my_volume
docker system prune -f
Wichtig: Das Entfernen von Volumes löscht alle gespeicherten Daten dauerhaft.
Fehlerbehebung
- Problem: Daten verschwinden nach dem Neustart des Containers
Ursache: Kein Volume oder Bind-Mount verwendet
Lösung: Persistent Storage mit Volumes oder Bind-Mounts anhängen - Problem: Berechtigungsfehler
Ursache: Berechtigungsfehler im Host-Verzeichnis
Lösung: Berechtigungen mitchmododerchownanpassen - Problem: Volume wird nicht korrekt eingebunden
Ursache: Falscher Pfad oder Syntax
Lösung: Mount-Format und Pfade überprüfen
Fazit und nächste Schritte
Sie haben gelernt, wie Docker-Speicher funktioniert und wie Sie Daten mit Volumes und Bind-Mounts persistent speichern können. Sie verstehen auch, wann Sie jeden Ansatz in der Produktion verwenden sollten. Als nächstes erkunden Sie Docker Compose, um Multi-Container-Anwendungen zu verwalten und Speicher auf strukturiertere Weise zu definieren.