Einführung
Docker ist eine Container-Plattform, die eine leichtgewichtige, virtualisierte, portable, softwaredefinierte standardisierte Umgebung darstellt, in der Software isoliert von anderer Software auf dem physischen Host-Rechner ausgeführt werden kann. Docker ist eine entscheidende Komponente im Bereich der kontinuierlichen Entwicklung und Integration (Continuous Development and Integration) der Softwareentwicklung. Durch die Bereitstellung einer konsistenten Laufzeitumgebung stellt Docker sicher, dass sich Software unabhängig von der physischen Host-Maschine, auf der sie bereitgestellt wird, gleich verhält. Für einen gründlichen Überblick über das Docker-Ökosystem lesen Sie diesen Artikel.
Obwohl Docker-Container in sich geschlossen sind, müssen sie manchmal den Zugriff auf Daten teilen oder Daten auf der Festplatte speichern, nachdem der Container gestoppt wurde. Daten können in Form von Datenbanken, Protokolldateien oder benutzergenerierten Daten vorliegen. Solche Daten können nicht in eine Docker-Image-Konfigurationsdatei aufgenommen werden, müssen aber für die erwartete Ausführung Ihrer Anwendung verfügbar sein. Das Teilen und Speichern von Daten in Docker-Containern wird durch Docker Volumes verwaltet. Docker Volumes können während der Container-Erstellung oder später erstellt und an Container angehängt werden. In diesem Tutorial besprechen wir die vier verschiedenen Möglichkeiten, Daten zwischen Containern auszutauschen.
Voraussetzungen
- Richten Sie einen Server mit Ubuntu 20.04 ein und Erstellen Sie einen Nicht-Root-Benutzer mit sudo-Rechten. Melden Sie sich mit dem Nicht-Root-Benutzer an, um mit den folgenden Schritten fortzufahren.
- Installieren Sie Docker – wir haben ein Tutorial zu Wie man Docker auf Ubuntu installiert und bedient, Sie müssen die Schritte 1, 2, 3 und 4 befolgen. Dies sollte für jede Ubuntu-Distribution funktionieren.
Bitte beachten Sie, dass die Anweisungen und Befehle für Docker, obwohl wir mit Ubuntu 20.04 arbeiten, auf jedem anderen Betriebssystem funktionieren, auf dem Docker installiert ist und der sudo-Benutzer zur docker-Gruppe hinzugefügt wurde, wie in den Voraussetzungen oben erklärt.
Schritt 1: Unabhängige Docker-Volumes erstellen
Wir beginnen mit der Erstellung unabhängiger Volumes, die mit keinem Docker-Container in Verbindung stehen. Dazu steht uns der Befehl docker volume create zur Verfügung, der in der Docker-Version 1.9 eingeführt wurde. Geben Sie den folgenden Befehl ein, um ein Volume namens Step1DataVolume :
|
1 |
docker volume create --name Step1DataVolume |
Sie sollten die folgende Ausgabe sehen, die anzeigt, dass die Erstellung des Volumes erfolgreich war:
![]()
Da wir nun ein unabhängiges Volume haben, können wir als Beispiel einen neuen Container aus dem offiziellen Ubuntu-Image erstellen, um es zu nutzen. Geben Sie den folgenden Befehl ein, um den Container zu erstellen und das Volume anzuhängen:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
In diesem Befehl wird das Flag --rm den Container nach dem Beenden automatisch löschen. Das Flag -v wird verwendet, um das Volume zu spezifizieren und zu mounten. Das Flag -v erwartet den Namen des Volumes, einen Doppelpunkt und den absoluten Pfad innerhalb des Containers, an dem das Volume erscheinen soll. Denken Sie daran, dass bei der Ausführung des Befehls die angegebenen Verzeichnisse im Pfad erstellt werden, falls sie noch nicht existieren. Wenn sie bereits existieren, blendet das gemountete Volume den vorhandenen Inhalt aus. Für das Flag -ti gibt das -t Zugriff auf das Terminal, und das -i ermöglicht es uns, über das Terminal mit dem Container zu interagieren.
Führen Sie im Container den folgenden Befehl aus, um einige Daten in das Volume zu schreiben:
|
1 |
echo "Step One Sample Text" > /Step1DataVolume/StepOne.txt |
Geben Sie exit ein und drücken Sie enter , um den Container zu verlassen. Wie erklärt, wird der Container beim Beenden dank des Flags --rm automatisch gelöscht, das Volume bleibt jedoch weiterhin zugänglich.
Um zu überprüfen, ob das Volume noch existiert, können Sie den Befehl docker volume inspect verwenden:
|
1 |
docker volume inspect Step1DataVolume |
Sie sollten die folgende Ausgabe sehen:

Als Nächstes erstellen wir einen neuen Container. Hängen Sie zuerst das Volume an und prüfen Sie, ob wir auf den im vorherigen Container erstellten Text zugreifen können. Geben Sie den folgenden Befehl ein, um den Container zu erstellen und auszuführen, unter Verwendung des ubuntu Image:
|
1 |
docker run -ti --rm -v Step1DataVolume:/Step1DataVolume ubuntu |
Führen Sie im Container den folgenden Befehl aus, um zu überprüfen, ob die StepOne.txt Datei existiert:
|
1 |
cat /Step1DataVolume/StepOne.txt |
Sie sollten eine ähnliche Ausgabe sehen:

Geben Sie als Nächstes exit ein und drücken Sie Enter um den Container zu verlassen. In diesem Schritt haben Sie gelernt, wie Sie die Datenpersistenz mithilfe von unabhängigen Docker-Volumes handhaben und wie Sie Volumes an Container anhängen.
Schritt 2: Erstellen eines Docker-Volumes, das Daten beim Löschen eines Containers beibehält
In diesem Schritt verwenden wir einen einzigen Befehl, um gleichzeitig mit der Erstellung eines Containers ein Volume zu erstellen. Anschließend löschen wir den Container und hängen das Volume an einen neuen Container an. Der Befehl ähnelt dem in Schritt 1 verwendeten, wir fügen jedoch ein Flag --name hinzu, um einen Namen für den Container anzugeben:
|
1 |
docker run -ti --name=Step2Container1 -v Step2DataVolume:/Step2DataVolume ubuntu |
Geben Sie im Container den folgenden Befehl ein, um Daten in das Volume zu schreiben und zu überprüfen, ob die Daten vorhanden sind:
|
1 2 3 |
echo "Step Two Sample Text" > /Step2DataVolume/StepTwo.txt cat /Step2DataVolume/StepTwo.txt |
Unten sehen Sie die Ausgabe der drei Befehle:

Verlassen Sie als Nächstes den Container. Wenn Sie den Container mit dem folgenden Befehl neu starten, wird das Volume automatisch angehängt:
|
1 |
docker start -ai Step2Container1 |
Überprüfen Sie im Container, ob das Volume gemountet ist, indem Sie das Vorhandensein der StepTwo.txt Datei mit dem Befehl überprüfen:
|
1 |
cat /Step2DataVolume/StepTwo.txt |
Hier ist die Ausgabe:

Sie können den Container jetzt verlassen. Docker verhindert das Entfernen eines Volumes, auf das ein anderer Container verweist. Sie können versuchen, das Volume mit dem folgenden Befehl zu entfernen:
|
1 |
docker volume rm Step2DataVolume |
Sie sollten die Fehlermeldung in der Ausgabe sehen:
![]()
Lassen Sie uns den Container mithilfe der in der Ausgabe angezeigten Container-ID mit dem Befehl docker rm entfernen:
|
1 |
docker rm e3932e65e484bbf4524ca8de1b1dd99c4e92c12f92a9d6b0567a643d0aa6bb2d |
Ersetzen Sie die hervorgehobene Container-ID durch die ID Ihres Containers, die in Ihrem Terminal angezeigt wird. Der Befehl entfernt den Container, löscht jedoch nicht das von uns erstellte Volume. Sie können die verfügbaren Volumes mit dem Befehl docker volume ls auflisten, um dies zu überprüfen:
|
1 |
docker volume ls |
Hier ist die Ausgabe:

Um den in Schritt 2 erstellten Container zu entfernen, geben Sie den folgenden Befehl ein:
|
1 |
docker volume rm Step2DataVolume |
In diesem Schritt konnten Sie gleichzeitig mit der Erstellung eines Containers ein Docker-Volume erstellen. Sehen wir uns an, wie wir ein Volume aus einem vorhandenen Verzeichnis mit Daten erstellen können.
Schritt 3: Erstellen eines Docker-Volumes aus einem vorhandenen Verzeichnis mit Daten
Wenn Sie Daten in ein Volume kopieren möchten, können Sie beim Erstellen eines Containers ein Volume erstellen und den Pfad zu einem Verzeichnis angeben, das die Daten im Basis-Image enthält. Im folgenden Befehl erstellen wir einen Container und fügen ein Daten-Volume unter /var hinzu, bei dem es sich um ein Verzeichnis handelt, das Daten im Basis-Image enthält:
|
1 |
docker run -ti --rm -v Step3DataVolume:/var ubuntu |
Wenn der Befehl ausgeführt wird, wird der Inhalt aus dem Verzeichnis /var des Basis-Images in das Volume kopiert. Das Volume kann an einen neuen Container angehängt werden. Verlassen Sie als Nächstes den Container:

Geben Sie den folgenden Befehl ein, um den Container zu erstellen, das Volume anzuhängen und den Inhalt des Volumes mit dem Befehl ls aufzulisten:
|
1 |
docker run --rm -v Step3DataVolume:/Step3DataVolume ubuntu ls Step3DataVolume |
Sie sollten eine ähnliche Ausgabe des Befehls sehen, bei der es sich um eine Kopie des Inhalts des Verzeichnisses /var aus dem Basis-Image handelt, das nun im Step3DataVolume:

Während das Mounten des /var Verzeichnisses, wie wir es in diesem Beispiel getan haben, unpraktisch sein mag, hilft es uns zu verstehen, dass Sie jedes in Ihren benutzerdefinierten Images erstellte Verzeichnis in ein Docker-Volume mounten können, um die Daten für andere Container verfügbar zu machen.
Schritt 4: Gemeinsame Nutzung von Daten zwischen mehreren Docker-Containern
In den meisten Fällen möchten Sie, dass mehrere Container auf Daten aus einem Docker-Volume zugreifen. In den vorherigen Beispielen haben wir ein Volume nur an einen Container angehängt. Jetzt lernen Sie, wie Sie ein Volume an mehrere Container anhängen. Obwohl Sie dies leicht erreichen können, übernimmt Docker keine Dateisperrung (File Locking). Wenn mehrere Container in dasselbe Volume schreiben, müssen Sie die in diesen Containern ausgeführten Anwendungen individuell so entwerfen, dass sie das Schreiben in gemeinsam genutzte Datenspeicher verarbeiten, um Datenbeschädigungen zu vermeiden.
- Erstellen Sie Step4Container1 und Step4DataVolume
Verwenden Sie den docker run -Befehl mit dem --name -Flag, um einen benannten Container zu erstellen:
|
1 |
docker run -ti --name=Step4Container1 -v Step4DataVolume:/Step4DataVolume ubuntu |
Führen Sie im Container den folgenden Befehl aus, um eine Textdatei zu erstellen und Text hinzuzufügen:
|
1 |
echo "Step Four Sample Text" > /Step4DataVolume/StepFour.txt |
Verlassen Sie danach den Container und kehren Sie in die Host-Umgebung zurück. Nun möchten wir einen weiteren Container erstellen und die Volumes von Step4Container1 darin mounten.
- Erstellen Sie Step4Container2 und hängen Sie die Volumes aus dem Container Step4Container1
Führen Sie den folgenden Befehl aus, um Step4Container2 zu erstellen und Volumes von Step4Container1:
|
1 |
docker run -ti --name=Step4Container2 --volumes-from Step4Container1 ubuntu |
Verwenden Sie im Container den cat -Befehl, um die Datenpersistenz zu überprüfen:
|
1 |
cat /Step4DataVolume/StepFour.txt |
Sie sollten die folgende Ausgabe sehen:

Wir können der Datei von Step4Container2 aus weiteren Text hinzufügen, indem wir den folgenden Befehl eingeben:
|
1 |
echo "We are appending text while inside Step4Container2" >> /Step4DataVolume/StepFour.txt |
Verlassen Sie danach den Container, und wir kehren zu Step4Container1 zurück, um zu prüfen, ob die Daten noch vorhanden sind.
- Überprüfen der in dem Docker-Volume zwischen verschiedenen Containern vorgenommenen Änderungen
Um die Änderungen anzuzeigen, starten Sie zuerst den Step4Container1 neu mit dem Befehl:
|
1 |
docker start -ai Step4Container1 |
Prüfen Sie auf Änderungen mit dem Befehl:
|
1 |
cat /Step4DataVolume/StepFour.txt |
Sie sollten eine Ausgabe ähnlich dem folgenden Screenshot sehen:

Sobald Sie überprüft haben, dass beide Container Daten in dasselbe Volume lesen und schreiben können, können Sie den Container nun verlassen. Wie bereits erwähnt, übernimmt Docker keine Dateisperrung. Es ist die Aufgabe Ihrer in den Containern ausgeführten Anwendungslogik, den Lese-Schreib-Zugriff auf gemeinsam genutzte Datenspeicher zu verwalten. Docker ermöglicht das Mounten von Volumes als schreibgeschützt (read-only), um eine versehentliche Datenbeschädigung durch Container zu verhindern, die nur Lesezugriff benötigen, indem :ro hinzugefügt wird, wie im nächsten Beispiel gezeigt.
- Mounten eines Volumes in einen Docker-Container als schreibgeschützt
Für dieses Beispiel erstellen wir einen Container namens Step4Container3. Im Erstellungsbefehl mounten wir Volumes von Step4Container1 und fügen :ro hinzu, um anzugeben, dass dieser Container nur Lesezugriff hat, aber nicht auf das Volume schreiben kann. Führen Sie den folgenden Befehl in Ihrem Terminal aus:
|
1 |
docker run -ti --name=Step4Container3 --volumes-from Step4Container1:ro ubuntu |
Sobald Sie sich im Container befinden, können Sie die Textdatei im Volume lesen, indem Sie den folgenden Befehl eingeben:
|
1 |
cat /Step4DataVolume/StepFour.txt |

Wenn Sie jedoch versuchen, die Datei mit dem folgenden Befehl zu entfernen:
|
1 |
rm /Step4DataVolume/StepFour.txt |
Sie erhalten eine Fehlermeldung in Ihrem Terminal wie:
![]()
Sobald Sie die Lese- und Schreibberechtigungen überprüft haben, können Sie den Container verlassen. Wenn Sie die in diesem Tutorial erstellten Container und Volumes bereinigen möchten, führen Sie die folgenden Befehle aus:
|
1 2 3 |
docker rm Step4Container1 Step4Container2 Step4Container3 docker volume rm Step4DataVolume |
In diesem Schritt haben Sie gelernt, wie Sie Daten mithilfe von Docker-Volumes zwischen mehreren Containern austauschen und Daten-Volumes als schreibgeschützt in Container einbinden.
Fazit
In diesem Tutorial haben Sie einige Docker-Volumes erstellt und gelernt, wie Sie Daten zwischen Docker-Containern austauschen. Beim Datenaustausch zwischen Containern haben wir festgestellt, dass die jeweilige Anwendungslogik innerhalb des Containers das Sperren von Dateien (File Locking) handhaben muss, um Datenbeschädigungen beim Schreiben in gemeinsam genutzte Datenspeicher zu verhindern, da Docker keine Implementierung für das Sperren von Dateien besitzt.
Weitere Ressourcen zur Nutzung von Docker finden Sie in weiteren Tutorials auf unserem Blog:
- Wie man Daten zwischen einem Docker-Container und einem Host austauscht
- Docker-Ressourcen bereinigen – Images, Container und Volumes
- Bereitstellung von Laravel, Nginx und MySQL mit Docker Compose
- Installation und Einrichtung von Docker auf CentOS 7
Viel Spaß beim Computing!
Kommentare
Noch keine Kommentare. Schreiben Sie den ersten.