Zurück zum Blog

Daten zwischen Docker-Containern teilen

Daten zwischen Docker-Containern teilen

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

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 :

Sie sollten die folgende Ausgabe sehen, die anzeigt, dass die Erstellung des Volumes erfolgreich war:

Docker Volume Create

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:

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:

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:

Sie sollten die folgende Ausgabe sehen:

Docker Volume Inspect

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:

Führen Sie im Container den folgenden Befehl aus, um zu überprüfen, ob die StepOne.txt Datei existiert:

Sie sollten eine ähnliche Ausgabe sehen:

Docker Volume Content 1

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:

Geben Sie im Container den folgenden Befehl ein, um Daten in das Volume zu schreiben und zu überprüfen, ob die Daten vorhanden sind:

Unten sehen Sie die Ausgabe der drei Befehle:

Persistent Docker Volume

Verlassen Sie als Nächstes den Container. Wenn Sie den Container mit dem folgenden Befehl neu starten, wird das Volume automatisch angehängt:

Überprüfen Sie im Container, ob das Volume gemountet ist, indem Sie das Vorhandensein der StepTwo.txt Datei mit dem Befehl überprüfen:

Hier ist die Ausgabe:

Docker Volume After Restart

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:

Sie sollten die Fehlermeldung in der Ausgabe sehen:

Error Response

Lassen Sie uns den Container mithilfe der in der Ausgabe angezeigten Container-ID mit dem Befehl docker rm entfernen:

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:

Hier ist die Ausgabe:

Docker Volume List

Um den in Schritt 2 erstellten Container zu entfernen, geben Sie den folgenden Befehl ein:

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:

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:

Create Docker Volume

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:

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:

Copy Docker Volume

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:

Führen Sie im Container den folgenden Befehl aus, um eine Textdatei zu erstellen und Text hinzuzufügen:

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:

Verwenden Sie im Container den cat -Befehl, um die Datenpersistenz zu überprüfen:

Sie sollten die folgende Ausgabe sehen:

Container Data Sharing

Wir können der Datei von Step4Container2 aus weiteren Text hinzufügen, indem wir den folgenden Befehl eingeben:

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:

Prüfen Sie auf Änderungen mit dem Befehl:

Sie sollten eine Ausgabe ähnlich dem folgenden Screenshot sehen:

Copied Container Data

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:

Sobald Sie sich im Container befinden, können Sie die Textdatei im Volume lesen, indem Sie den folgenden Befehl eingeben:

Read Only Mount

Wenn Sie jedoch versuchen, die Datei mit dem folgenden Befehl zu entfernen:

Sie erhalten eine Fehlermeldung in Ihrem Terminal wie:

Read Only Error

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:

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:

Viel Spaß beim Computing!

author

Pranay Kapgate

Autor · CloudSigma

Preslav Dobrev ist ein kreativer Designer bei CloudSigma und konzentriert sich auf eine konsistente Unternehmensidentität durch traditionelle und innovative Marketingkanäle. Er versteht es meisterhaft, künstlerische Vision mit strategischem Marketing zu verbinden, um wirkungsvolle Markengeschichten zu schaffen.

Kommentare

Noch keine Kommentare. Schreiben Sie den ersten.