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:
- Erstellen eines Daten-Volumes mit dem Namen
my-vol.
labex:~/ $ docker volume ls
DRIVER VOLUME NAME
local jenkins-data
local minikube
local my-vol
- 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"
}
]
- Zum
Mountpointnavigieren und die Dateitest.txterstellen.
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 suzumroot-Benutzer wechseln und das Passwort für den Benutzerrootmitsudo passwd rootfestlegen.
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:
- 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
- Erstellen eines Containers namens
nginxauf Basis des Nginx-Images, der sein Verzeichnis/usr/share/nginx/htmlauf das Volumenginx-volmountet.
labex:~/ $ docker ps | grep nginx
c39296aaf39e nginx "/docker-entrypoint.…" 35 seconds ago Up 31 seconds 80/tcp nginx
- Kopieren der Datei
/home/labex/project/index.htmlin dennginx-Container.
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat index.html
hello world
- Ü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:
- Erstellen eines
nginx-Verzeichnisses im Verzeichnis/tmp.
labex:/tmp/ $ ls | grep nginx
nginx
- Starten des
nginx-host-Containers basierend auf demnginx-Image, wobei das Verzeichnis/tmp/nginxauf das Verzeichnis/usr/share/nginx/htmlim Container gemountet wird.
labex:/tmp/ $ docker ps | grep nginx-host
6fc2d40e12df nginx "/docker-entrypoint.…" 44 seconds ago Up 43 seconds 80/tcp nginx-host
- Ü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"
}
],
- Kopieren der Datei
/home/labex/project/nginx.txtin das Verzeichnis/usr/share/nginx/htmldesnginx-host-Containers.
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat nginx.txt
hello nginx
- Verifizieren des Inhalts im Container.
labex:nginx/ $ docker exec nginx-host cat /usr/share/nginx/html/nginx.txt
hello nginx
- Überprüfen des Verzeichnisses
/tmp/nginxauf dem lokalen Rechner, um zu sehen, ob die Dateinginx.txtdort 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 Pathkennen. - 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,touchusw. 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:
- Erstellen eines Verzeichnisses
/tmp/shareauf dem lokalen Host.
labex:/tmp/ $ ls -ld /tmp/share
drwxr-xr-x 2 labex labex 4096 Jan 20 18:20 /tmp/share
- Erstellen eines Containers namens
nginx-share(Nginx-Image) und Mounten des lokalen Verzeichnisses/tmp/sharenach/usr/share/nginx/htmlim Container.
labex:/tmp/ $ docker ps | grep nginx-share
216d02d94f39 nginx "/docker-entrypoint.…" 55 seconds ago Up 55 seconds 80/tcp nginx-share
- Erstellen eines Containers namens
busybox-share(Busybox-Image), der die Volumes vom Containernginx-shareübernimmt.
labex:/tmp/ $ docker ps | grep busy
30bf04aee681 busybox "sh" 43 seconds ago Up 42 seconds busybox-share
- Kopieren der Datei
/home/labex/project/share.txtin denbusybox-share-Container.
labex:/tmp/ $ pwd
/tmp
labex:/tmp/ $ cat share.txt
hello share
- Überprüfen der Datei im
nginx-share-Container.
labex:/tmp/ $ docker exec nginx-share cat /usr/share/nginx/html/share.txt
hello share
- Überprüfen im
busybox-share-Container, ob die Dateishare.txtdort 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,touchusw. 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.



