Arbeiten mit Docker-Volumes

DockerBeginner
Jetzt üben

Einführung

In diesem Lab lernen Sie, wie Sie Daten in Docker-Containern mithilfe von Volumes verwalten. Docker-Volumes sind der bevorzugte Mechanismus, um Daten zu persistieren, die von Docker-Containern erzeugt und verwendet werden. Dieses Lab führt Sie durch verschiedene Aspekte von Docker-Volumes, einschließlich Erstellung, Verwaltung, Datenaustausch sowie Sicherung und Wiederherstellung. Am Ende dieses Labs werden Sie ein solides Verständnis dafür haben, wie Sie Daten in Docker-Umgebungen effektiv verwalten.

Dies ist ein geführtes Lab, das Schritt-für-Schritt-Anleitungen bietet, um Ihnen beim Lernen und Üben zu helfen. Folgen Sie den Anweisungen sorgfältig, um jeden Schritt abzuschließen und praktische Erfahrungen zu sammeln. Historische Daten zeigen, dass dies ein Lab für Anfänger mit einer Abschlussquote von 97 % ist. Es hat eine positive Bewertung von 99 % von Lernenden erhalten.

Docker-Speicheroptionen verstehen

Bevor wir uns in die Docker-Volumes vertiefen, ist es wichtig, die verschiedenen in Docker verfügbaren Speicheroptionen zu verstehen. Docker bietet drei Hauptoptionen für die Speicherung von Daten:

  1. Volumes: Der bevorzugte Mechanismus zur Datenspeicherung in Docker.
  2. Bind Mounts: Verbinden einen spezifischen Pfad des Host-Rechners mit einem Container.
  3. tmpfs Mounts: Speichern Daten temporär im Arbeitsspeicher des Host-Rechners.

In diesem Lab konzentrieren wir uns primär auf Volumes, da sie die flexibelste und empfohlene Option für die Datenverwaltung in Docker darstellen.

Lassen Sie uns zunächst die aktuellen Volumes auf Ihrem System auflisten:

docker volume ls

Sie werden eine Ausgabe ähnlich dieser sehen:

DRIVER    VOLUME NAME
local     jenkins-data

Dieser Befehl listet alle Docker-Volumes auf Ihrem System auf. Die Ausgabe zeigt den Volume-Treiber (normalerweise "local") und den Namen des Volumes. Möglicherweise sehen Sie bereits vorhandene Volumes, oder die Liste ist leer, falls Sie bisher noch keine Volumes erstellt haben.

Machen Sie sich keine Sorgen, wenn Sie andere Volume-Namen oder gar keine Volumes sehen. Das ist völlig normal und hängt davon ab, was Sie zuvor mit Docker auf Ihrem System gemacht haben.

Benannte Volumes erstellen und verwalten

Lassen Sie uns nun ein neues benanntes Volume (Named Volume) erstellen. Ein benanntes Volume ist ein Volume, das Sie explizit erstellen und dem Sie einen spezifischen Namen geben. Dies erleichtert den späteren Zugriff und die Verwaltung.

Führen Sie diesen Befehl aus, um ein neues Volume zu erstellen:

docker volume create my_data

Dieser Befehl erstellt ein neues Volume mit dem Namen my_data. Docker kümmert sich um alle Details, wo und wie dieses Volume auf Ihrem Host-System gespeichert wird.

Überprüfen wir nun, ob das Volume erstellt wurde:

docker volume ls

Sie sollten nun my_data in der Liste der Volumes sehen, zusammen mit allen Volumes, die bereits vorher vorhanden waren.

Um detailliertere Informationen über das Volume zu erhalten, können wir den Inspect-Befehl verwenden:

docker volume inspect my_data

Dies wird eine Ausgabe wie diese erzeugen:

[
  {
    "CreatedAt": "2024-08-22T14:31:09+08:00",
    "Driver": "local",
    "Labels": {},
    "Mountpoint": "/var/lib/docker/volumes/my_data/_data",
    "Name": "my_data",
    "Options": {},
    "Scope": "local"
  }
]

Diese Ausgabe verrät uns einiges über unser Volume:

  • Wann es erstellt wurde
  • Welcher Treiber verwendet wird (in diesem Fall "local")
  • Der Mountpoint (der tatsächliche Speicherort der Daten auf Ihrem Host-System)
  • Der von uns vergebene Name

Keine Sorge, wenn Sie im Moment noch nicht alle Details verstehen. Die wichtigsten Teile für uns sind der Name (Name) und der Mountpoint (Mountpoint).

Volumes mit Containern verwenden

Da wir nun ein Volume haben, wollen wir es mit einem Container verwenden. Wir starten einen neuen Container und hängen unser Volume darin ein.

Führen Sie diesen Befehl aus:

docker run -d --name my_container -v my_data:/app/data ubuntu:latest sleep infinity

Lassen Sie uns diesen Befehl aufschlüsseln:

  • docker run: Weist Docker an, einen neuen Container zu starten.
  • -d: Führt den Container im Detached-Modus (im Hintergrund) aus.
  • --name my_container: Gibt unserem Container einen Namen, damit wir ihn später leichter ansprechen können.
  • -v my_data:/app/data: Mountet unser Volume my_data in das Verzeichnis /app/data innerhalb des Containers.
  • ubuntu:latest: Das Image, das wir für unseren Container verwenden.
  • sleep infinity: Der Befehl, den der Container ausführt. Er sorgt dafür, dass der Container unbegrenzt weiterläuft.

Unser Container läuft nun mit dem gemounteten Volume. Lassen Sie uns einige Daten im Volume erstellen:

docker exec my_container sh -c "echo 'Hello from Docker volume' > /app/data/test.txt"

Dieser Befehl bewirkt Folgendes:

  • docker exec: Ermöglicht es uns, einen Befehl in einem laufenden Container auszuführen.
  • my_container: Der Name unseres Containers.
  • sh -c "...": Führt einen Shell-Befehl innerhalb des Containers aus.
  • Der eigentliche Befehl erstellt eine Datei namens test.txt in unserem Volume mit dem Inhalt "Hello from Docker volume".

Um zu überprüfen, ob die Daten geschrieben wurden, können wir die Datei auslesen:

docker exec my_container cat /app/data/test.txt

Sie sollten die Nachricht "Hello from Docker volume" in der Konsole sehen.

Datenaustausch zwischen Containern

Einer der großen Vorteile von Docker-Volumes ist die Möglichkeit, Daten zwischen Containern zu teilen. Lassen Sie uns einen weiteren Container erstellen, der dasselbe Volume verwendet:

docker run -d --name another_container -v my_data:/app/shared_data ubuntu:latest sleep infinity

Dieser Befehl ist dem vorherigen sehr ähnlich, aber wir geben dem Container einen anderen Namen und mounten das Volume an einen anderen Pfad innerhalb des Containers.

Lassen Sie uns nun überprüfen, ob dieser neue Container auf die zuvor erstellten Daten zugreifen kann:

docker exec another_container cat /app/shared_data/test.txt

Sie sollten dieselbe Nachricht "Hello from Docker volume" sehen, die wir zuvor geschrieben haben. Dies beweist, dass beide Container auf dieselben Daten zugreifen.

Fügen wir nun von diesem neuen Container aus weitere Daten hinzu:

docker exec another_container sh -c "echo 'Data from another container' >> /app/shared_data/test.txt"

Dieser Befehl hängt eine neue Zeile an unsere Datei test.txt an.

Wenn wir nun den Inhalt der Datei von einem der beiden Container aus prüfen, sollten wir beide Zeilen sehen:

docker exec my_container cat /app/data/test.txt

Die Ausgabe sollte sowohl "Hello from Docker volume" als auch "Data from another container" enthalten.

Dies demonstriert, wie Docker-Volumes verwendet werden können, um Daten zwischen Containern zu teilen, was für viele Anwendungen unglaublich nützlich ist.

Sichern und Wiederherstellen von Volumes

Das Sichern und Wiederherstellen von Docker-Volumes ist entscheidend für die Datensicherheit. Gehen wir den Prozess gemeinsam durch:

Zuerst müssen wir die Container stoppen und entfernen, die das Volume verwenden. Ein Volume kann nämlich nicht entfernt werden, solange es noch in Gebrauch ist:

docker stop my_container another_container
docker rm my_container another_container

Lassen Sie uns nun ein Backup unseres Volumes erstellen:

docker run --rm -v my_data:/source:ro -v $(pwd):/backup ubuntu tar cvf /backup/my_data_backup.tar -C /source .

Dieser Befehl mag komplex erscheinen, also schlüsseln wir ihn auf:

  • docker run --rm: Startet einen temporären Container und entfernt ihn automatisch nach Abschluss.
  • -v my_data:/source:ro: Mountet unser Volume schreibgeschützt (read-only) im Container.
  • -v $(pwd):/backup: Mountet das aktuelle Verzeichnis als /backup im Container.
  • ubuntu: Verwendet das Ubuntu-Image.
  • tar cvf /backup/my_data_backup.tar -C /source .: Erstellt ein Tar-Archiv der Volume-Daten.

Lassen Sie uns nun unser ursprüngliches Volume löschen:

docker volume rm my_data

Um die Daten wiederherzustellen, erstellen wir ein neues Volume und entpacken das Backup hinein:

docker volume create my_restored_data
docker run --rm -v my_restored_data:/dest -v $(pwd):/backup ubuntu bash -c "tar xvf /backup/my_data_backup.tar -C /dest"

Dies erstellt ein neues Volume und extrahiert unser Backup dorthin.

Überprüfen wir, ob die Daten erfolgreich wiederhergestellt wurden:

docker run --rm -v my_restored_data:/app/data ubuntu cat /app/data/test.txt

Sie sollten den Inhalt der Datei sehen, die wir zuvor erstellt haben.

Zusammenfassung

In diesem Lab haben Sie gelernt, wie man mit Docker-Volumes arbeitet. Sie haben benannte Volumes erstellt und verwaltet, Volumes in Containern eingesetzt, Daten zwischen Containern geteilt sowie Sicherungs- und Wiederherstellungsoperationen durchgeführt. Diese Fähigkeiten sind essenziell für ein effektives Datenmanagement in Docker-Umgebungen.

Wichtige Erkenntnisse:

  • Docker-Volumes bieten eine flexible und effiziente Möglichkeit, persistente Daten in Containern zu verwalten.
  • Volumes können einfach über Docker-CLI-Befehle erstellt, inspiziert und gelöscht werden.
  • Daten in Volumes können von mehreren Containern gleichzeitig genutzt werden.
  • Das Sichern und Wiederherstellen von Volumes ist für den Datenerhalt von entscheidender Bedeutung und kann mit Standard-Linux-Befehlen umgesetzt werden.

Wenn Sie weiter mit Docker arbeiten, denken Sie immer daran, dass Datenpersistenz und -verwaltung ein kritischer Aspekt Ihrer containerisierten Anwendungen sind. Planen Sie stets Backup- und Wiederherstellungsstrategien ein, insbesondere in Produktionsumgebungen.