Docker-Volume-Management

DockerBeginner
Jetzt üben

Einführung

In diesem Abschnitt beschäftigen wir uns mit der Nutzung von persistenten Datenspeichern in Docker, den sogenannten Volumes. Sie werden die Eigenschaften dieser Speicherlösungen kennenlernen, den Unterschied zwischen internen und externen Volumes verstehen und erfahren, wann und wie man sie am besten einsetzt.

Daten-Volume-Verwaltung

Daten-Volumes sind der Standardweg für die Datenpersistenz in Docker. In diesem Abschnitt zeige ich Ihnen die gängigen Operationen für den praktischen Umgang mit Volumes.

Ziel

Ihr Ziel ist es, mit dem docker-Befehl ein Daten-Volume namens my-vol zu erstellen und diesem Volume eine Datei namens test.txt hinzuzufügen.

Ergebnisbeispiel

Hier ist ein Beispiel dafür, was Sie am Ende dieser Challenge erreicht haben sollten:

  1. Erstellen eines Daten-Volumes mit dem Namen my-vol.
labex:~/ $ docker volume ls
DRIVER    VOLUME NAME
local     jenkins-data
local     minikube
local     my-vol
  1. Ermitteln des Mountpoint über die Volume-Details.
[
  {
    "CreatedAt": "2024-01-20T17:37:33+08:00",
    "Driver": "local",
    "Labels": {},
    "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
    "Name": "my-vol",
    "Options": {},
    "Scope": "local"
  }
]
  1. Zum Mountpoint navigieren und die Datei test.txt erstellen.
root@iZj6cj604ytlr2cacq6vi2Z:/var/lib/docker/volumes/my-vol/_data## pwd
/var/lib/docker/volumes/my-vol/_data
root@iZj6cj604ytlr2cacq6vi2Z:/var/lib/docker/volumes/my-vol/_data## ls
test.txt

Anforderungen

Um diese Challenge abzuschließen, müssen Sie:

  • Wissen, wie man ein Daten-Volume mit dem docker-Befehl erstellt.
  • Eine Datei als root-Benutzer erstellen können.
  • Mit sudo su zum root-Benutzer wechseln und das Passwort für den Benutzer root mit sudo passwd root festlegen.

Container mit Daten-Volumes erstellen

In diesem Abschnitt werden wir Container unter Verwendung von Docker-Volumes erstellen und anschließend Dateien kopieren.

Ziel

Sie sollen ein Docker-Volume namens nginx-vol erstellen, dann einen Container namens nginx starten und das Volume einbinden. Schließlich kopieren Sie die Datei /home/labex/project/index.html in den nginx-Container.

Ergebnisbeispiel

Hier ist ein Beispiel für das gewünschte Ergebnis:

  1. Erstellen eines Daten-Volumes namens nginx-vol.
labex:~/ $ docker volume ls
DRIVER    VOLUME NAME
local     jenkins-data
local     minikube
local     my-vol
local     nginx-vol
  1. Erstellen eines Containers namens nginx auf Basis des Nginx-Images, der sein Verzeichnis /usr/share/nginx/html auf das Volume nginx-vol mountet.
labex:~/ $ docker ps | grep nginx
c39296aaf39e   nginx     "/docker-entrypoint.…"   35 seconds ago   Up 31 seconds   80/tcp    nginx
  1. Kopieren der Datei /home/labex/project/index.html in den nginx-Container.
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat index.html
hello world
  1. Überprüfen der kopierten Datei im nginx-Container.
labex:/tmp/ $ docker exec nginx cat /usr/share/nginx/html/index.html
hello world

Anforderungen

Um diese Challenge abzuschließen, müssen Sie:

  • Wissen, wie man ein Daten-Volume mit dem docker-Befehl erstellt.
  • Wissen, wie man einen Container startet.
  • Wissen, wie man lokale Dateien in Container kopiert.

Container mit Host-Pfad erstellen

In vielen Fällen werden keine Docker-Volumes verwendet, sondern stattdessen direkt Verzeichnisse des Host-Systems zur Datenpersistenz genutzt. In diesem Abschnitt werden wir ein lokales Verzeichnis verwenden, um Container zu erstellen.

Ziel

Ihr Ziel ist es, einen Container zu erstellen, der einen Host Path (Host-Pfad) verwendet. Kopieren Sie dann die Datei /home/labex/project/nginx.txt in den Container und verifizieren Sie, dass die Dateien im Container mit denen im Host-Pfad identisch sind.

Ergebnisbeispiel

Hier ist ein Beispiel für den Ablauf:

  1. Erstellen eines nginx-Verzeichnisses im Verzeichnis /tmp.
labex:/tmp/ $ ls | grep nginx
nginx
  1. Starten des nginx-host-Containers basierend auf dem nginx-Image, wobei das Verzeichnis /tmp/nginx auf das Verzeichnis /usr/share/nginx/html im Container gemountet wird.
labex:/tmp/ $ docker ps | grep nginx-host
6fc2d40e12df   nginx     "/docker-entrypoint.…"   44 seconds ago   Up 43 seconds   80/tcp    nginx-host
  1. Überprüfen der spezifischen Mount-Details mit dem Befehl docker inspect.
"Mounts": [
   {
         "Type": "bind",
         "Source": "/tmp/nginx",
         "Destination": "/usr/share/nginx/html",
         "Mode": "",
         "RW": true,
         "Propagation": "rprivate"
   }
],
  1. Kopieren der Datei /home/labex/project/nginx.txt in das Verzeichnis /usr/share/nginx/html des nginx-host-Containers.
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat nginx.txt
hello nginx
  1. Verifizieren des Inhalts im Container.
labex:nginx/ $ docker exec nginx-host cat /usr/share/nginx/html/nginx.txt
hello nginx
  1. Überprüfen des Verzeichnisses /tmp/nginx auf dem lokalen Rechner, um zu sehen, ob die Datei nginx.txt dort vorhanden ist.
labex:nginx/ $ pwd
/tmp/nginx
labex:nginx/ $ cat nginx.txt
hello nginx

Anforderungen

Um diese Challenge abzuschließen, müssen Sie:

  • Den zu verwendenden Host Path kennen.
  • Wissen, wie man Befehle innerhalb des Containers ausführt, um den Zugriff auf Host-Verzeichnisse oder Dateien zu prüfen.
  • Wissen, wie man einen Container mit einem Host-Pfad startet.
  • Mit grundlegenden Linux-Befehlen wie cd, mkdir, touch usw. vertraut sein.

Datenaustausch zwischen Containern

In einer containerisierten Umgebung ist es manchmal notwendig, Daten von einem Container mit einem anderen zu teilen. Es gibt verschiedene Techniken, um dies zu erreichen. In dieser Challenge untersuchen wir, wie Daten zwischen Containern geteilt werden können.

Ziel

Ihr Ziel ist es, den Datenaustausch zwischen zwei Containern zu implementieren. Konkret werden Sie einen Host-Pfad verwenden, um Container A zu starten. Danach starten Sie einen weiteren Container B, der das Speicher-Volume von Container A einbindet, um schließlich den Datenaustausch zwischen beiden zu ermöglichen.

Ergebnisbeispiel

Hier ist ein Beispiel für das Vorgehen:

  1. Erstellen eines Verzeichnisses /tmp/share auf dem lokalen Host.
labex:/tmp/ $ ls -ld /tmp/share
drwxr-xr-x 2 labex labex 4096 Jan 20 18:20 /tmp/share
  1. Erstellen eines Containers namens nginx-share (Nginx-Image) und Mounten des lokalen Verzeichnisses /tmp/share nach /usr/share/nginx/html im Container.
labex:/tmp/ $ docker ps | grep nginx-share
216d02d94f39   nginx     "/docker-entrypoint.…"   55 seconds ago   Up 55 seconds   80/tcp    nginx-share
  1. Erstellen eines Containers namens busybox-share (Busybox-Image), der die Volumes vom Container nginx-share übernimmt.
labex:/tmp/ $ docker ps | grep busy
30bf04aee681   busybox   "sh"                     43 seconds ago   Up 42 seconds             busybox-share
  1. Kopieren der Datei /home/labex/project/share.txt in den busybox-share-Container.
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat share.txt
hello share
  1. Überprüfen der Datei im nginx-share-Container.
labex:/tmp/ $ docker exec nginx-share cat /usr/share/nginx/html/share.txt
hello share
  1. Überprüfen im busybox-share-Container, ob die Datei share.txt dort ebenfalls verfügbar ist.
labex:/tmp/ $ docker exec busybox-share cat /usr/share/nginx/html/share.txt
hello share

Anforderungen

Um diese Challenge abzuschließen, müssen Sie:

  • Mit den grundlegenden Operationen und Konzepten von Docker-Containern vertraut sein.
  • Docker-Kommandozeilenwerkzeuge zum Erstellen, Ausführen und Stoppen von Containern beherrschen.
  • Das Konzept und die Verwendung von Daten-Volumes verstehen.
  • Wissen, wie man ein Daten-Volume in einen Container einbindet.
  • Mit grundlegenden Linux-Befehlen wie cd, mkdir, touch usw. vertraut sein.

Zusammenfassung

Herzlichen Glückwunsch zum Abschluss dieser Challenge! Wenn Sie nun sicher im Umgang mit Speicher-Volumes in Containern sind, können Sie dieses Wissen direkt in Ihren Projekten anwenden.

✨ Lösung prüfen und üben✨ Lösung prüfen und üben✨ Lösung prüfen und üben✨ Lösung prüfen und üben