GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Docker

So teilen Sie Daten zwischen Docker-Containern unter Ubuntu 22.04

Einführung

Docker ist ein beliebtes Containerisierungstool, das verwendet wird, um Softwareanwendungen mit einem Dateisystem auszustatten, das alles enthält, was sie zum Ausführen benötigen. Die Verwendung von Docker-Containern stellt sicher, dass sich die Software unabhängig davon, wo sie bereitgestellt wird, gleich verhält, da ihre Laufzeitumgebung konsistent ist.

Im Allgemeinen sind Docker-Container kurzlebig und werden nur so lange ausgeführt, wie es dauert, bis der im Container ausgegebene Befehl abgeschlossen ist. Manchmal müssen Anwendungen jedoch den Zugriff auf Daten teilen oder Daten beibehalten, nachdem ein Container gelöscht wurde. Datenbanken, benutzergenerierte Inhalte für eine Website und Protokolldateien sind nur einige Beispiele für Daten, die unpraktisch oder unmöglich in ein Docker-Image aufgenommen werden können, auf die Anwendungen jedoch zugreifen müssen. Permanenter Zugriff auf Daten wird mit Docker Volumes bereitgestellt.

Docker-Volumes können mit demselben Befehl erstellt und angehängt werden, mit dem ein Container erstellt wird, oder sie können unabhängig von Containern erstellt und später angefügt werden. In diesem Artikel sehen Sie sich vier verschiedene Möglichkeiten an, Daten zwischen Containern auszutauschen.

Voraussetzungen

Um diesem Artikel zu folgen, benötigen Sie einen Ubuntu 22.04-Server mit Folgendem:

  • Ein Nicht-Root-Benutzer mit sudo-Berechtigungen. Die Anleitung zur Ersteinrichtung des Servers mit Ubuntu 22.04 erläutert, wie Sie dies einrichten.
  • Docker wird mit den Anweisungen aus Schritt 1 installiert und Schritt 2 von How To Install and Use Docker on Ubuntu 22.04

Hinweis: Auch wenn die Voraussetzungen Anweisungen zum Installieren von Docker auf Ubuntu 22.04 enthalten, ist der docker Befehle für Docker-Datenvolumes in diesem Artikel sollten auf anderen Betriebssystemen funktionieren, solange Docker installiert ist und der sudo-Benutzer zu docker hinzugefügt wurde Gruppe.

Schritt 1 – Erstellen eines unabhängigen Volumes

Eingeführt in der Version 1.9 von Docker, das docker volume create Mit dem Befehl können Sie ein Volume erstellen, ohne es einem bestimmten Container zuzuordnen. Mit diesem Befehl fügen Sie ein Volume mit dem Namen DataVolume1 hinzu :

  1. docker volume create --name DataVolume1

Der Name wird angezeigt und zeigt an, dass der Befehl erfolgreich war:

OutputDataVolume1

Um das Volume zu nutzen, erstellen Sie mit dem --rm einen neuen Container aus dem Ubuntu-Image Flag, um es beim Beenden automatisch zu löschen. Sie verwenden auch -v um das neue Volume zu mounten. -v erfordert den Namen des Volumes, einen Doppelpunkt, dann den absoluten Pfad, wo das Volume im Container erscheinen soll. Wenn die Verzeichnisse im Pfad nicht als Teil des Images vorhanden sind, werden sie erstellt, wenn der Befehl ausgeführt wird. Wenn sie tun existieren, verbirgt das gemountete Volume den bestehenden Inhalt:

  1. docker run -ti --rm -v DataVolume1:/datavolume1 ubuntu

Schreiben Sie im Container einige Daten auf das Volume:

  1. echo "Example1" > /datavolume1/Example1.txt

Weil Sie den --rm verwendet haben Flag, wird Ihr Container beim Beenden automatisch gelöscht. Auf Ihr Volume kann jedoch weiterhin zugegriffen werden.

  1. exit

Sie können mit docker volume inspect überprüfen, ob das Volume auf Ihrem System vorhanden ist :

  1. docker volume inspect DataVolume1
Output[
    {
        "CreatedAt": "2018-07-11T16:57:54Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/DataVolume1/_data",
        "Name": "DataVolume1",
        "Options": {},
        "Scope": "local"
    }
]

Hinweis: Sie können sich sogar die Daten auf dem Host unter dem als Mountpoint aufgeführten Pfad ansehen . Sie sollten es jedoch vermeiden, es zu ändern, da es zu Datenbeschädigungen führen kann, wenn Anwendungen oder Container Änderungen nicht erkennen.

Starten Sie als Nächstes einen neuen Container und hängen Sie DataVolume1 an :

  1. docker run --rm -ti -v DataVolume1:/datavolume1 ubuntu

Überprüfen Sie den Inhalt:

  1. cat /datavolume1/Example1.txt
OutputExample1

Beenden Sie den Container:

  1. exit

In diesem Beispiel haben Sie ein Volume erstellt, es an einen Container angehängt und seine Persistenz überprüft.

Schritt 2 – Erstellen eines Volumes, das beibehalten wird, wenn der Container entfernt wird

Im nächsten Beispiel erstellen Sie gleichzeitig mit dem Container ein Volume, löschen den Container und hängen das Volume dann an einen neuen Container an.

Sie verwenden den docker run Befehl zum Erstellen eines neuen Containers mit dem Basis-Ubuntu-Image. -t gibt uns ein Terminal und -i wird es uns ermöglichen, damit zu interagieren. Zur Verdeutlichung verwenden Sie --name um den Container zu identifizieren.

Das -v -Flag ermöglicht es uns, ein neues Volume zu erstellen, das Sie DataVolume2 nennen . Sie verwenden einen Doppelpunkt, um diesen Namen von dem Pfad zu trennen, in dem das Volume im Container bereitgestellt werden soll. Schließlich geben Sie das Ubuntu-Basisimage an und verlassen sich auf den Standardbefehl in der Docker-Datei des Ubuntu-Basisimages, bash , um uns in eine Shell fallen zu lassen:

  1. docker run -ti --name=Container2 -v DataVolume2:/datavolume2 ubuntu

Hinweis: Das -v Flagge ist sehr flexibel. Es kann ein Volume mit nur einer geringfügigen Anpassung der Syntax binden oder benennen. Wenn das erste Argument mit einem / beginnt oder ~/ Sie erstellen ein Bindmount. Entfernen Sie das, und Sie benennen das Volume. Zum Beispiel:

  • -v /path:/path/in/container Mountet das Host-Verzeichnis, /path unter /path/in/container
  • -v path:/path/in/container erstellt ein Volume mit dem Namen path ohne Beziehung zum Host.

Weitere Informationen zum Bindmounten eines Verzeichnisses vom Host finden Sie unter How To Share Data between a Docker Container and the Host

Während Sie sich im Container befinden, schreiben Sie einige Daten auf das Volume:

  1. echo "Example2" > /datavolume2/Example2.txt
  2. cat /datavolume2/Example2.txt
OutputExample2

Beenden Sie den Container:

  1. exit

Wenn Sie den Container neu starten, wird das Volume automatisch bereitgestellt:

  1. docker start -ai Container2

Stellen Sie sicher, dass das Volume tatsächlich gemountet wurde und Ihre Daten noch vorhanden sind:

  1. cat /datavolume2/Example2.txt
OutputExample2

Zum Schluss beenden und bereinigen:

  1. exit

Docker lässt uns ein Volume nicht entfernen, wenn es von einem Container referenziert wird. Um zu sehen, was passiert, versuchen Sie Folgendes:

  1. docker volume rm DataVolume2

Die Nachricht teilt uns mit, dass das Volume noch verwendet wird, und liefert die Langversion der Container-ID:

OutputError response from daemon: unable to remove volume: remove DataVolume2: volume is in use - [d0d2233b668eddad4986313c7a4a1bc0d2edaf0c7e1c02a6a6256de27db17a63]

Sie können die ID in der obigen Fehlermeldung verwenden, um den Container zu entfernen:

  1. docker rm d0d2233b668eddad4986313c7a4a1bc0d2edaf0c7e1c02a6a6256de27db17a63
Outputd0d2233b668eddad4986313c7a4a1bc0d2edaf0c7e1c02a6a6256de27db17a63

Das Entfernen des Behälters hat keinen Einfluss auf die Lautstärke. Sie können sehen, dass es noch auf dem System vorhanden ist, indem Sie die Volumes mit docker volume ls auflisten :

  1. docker volume ls
OutputDRIVER              VOLUME NAME
local               DataVolume2

Und Sie können docker volume rm verwenden um es zu entfernen:

  1. docker volume rm DataVolume2

In diesem Beispiel haben Sie gleichzeitig mit der Erstellung eines Containers ein leeres Datenvolume erstellt. In Ihrem nächsten Beispiel untersuchen Sie, was passiert, wenn Sie ein Volume mit einem Containerverzeichnis erstellen, das bereits Daten enthält.

Schritt 3 – Erstellen eines Volumes aus einem bestehenden Verzeichnis mit Daten

Im Allgemeinen wird ein Volume unabhängig mit docker volume create erstellt und das Erstellen eines Containers beim Erstellen eines Containers sind mit einer Ausnahme gleichwertig. Wenn Sie gleichzeitig mit einem Container und ein Volume erstellen Sie geben den Pfad zu einem Verzeichnis an, das Daten im Basisimage enthält, diese Daten werden in das Volume kopiert.

Als Beispiel erstellen Sie einen Container und fügen das Datenvolumen unter /var hinzu , ein Verzeichnis, das Daten im Basisbild enthält:

  1. docker run -ti --rm -v DataVolume3:/var ubuntu

Der gesamte Inhalt aus /var des Basisimages Das Verzeichnis wird in das Volume kopiert, und Sie können dieses Volume in einem neuen Container einhängen.

Verlassen Sie den aktuellen Container:

  1. exit

Diesmal verlassen Sie sich nicht auf die standardmäßige bash des Basisimages Befehl geben Sie Ihren eigenen ls aus Befehl, der den Inhalt des Volumes anzeigt, ohne die Shell aufzurufen:

  1. docker run --rm -v DataVolume3:/datavolume3 ubuntu ls datavolume3

Das Verzeichnis datavolume3 hat jetzt eine Kopie des Inhalts von /var des Basisimages Verzeichnis:

Outputbackups
cache
lib
local
lock
log
mail
opt
run
spool
tmp

Es ist unwahrscheinlich, dass Sie /var/ mounten möchten auf diese Weise, aber dies kann hilfreich sein, wenn Sie Ihr eigenes Image erstellt haben und eine einfache Möglichkeit zum Aufbewahren von Daten suchen. In Ihrem nächsten Beispiel demonstrieren Sie, wie ein Volume von mehreren Containern gemeinsam genutzt werden kann.

Schritt 4 – Gemeinsame Nutzung von Daten zwischen mehreren Docker-Containern

Bisher haben Sie jeweils ein Volume an einen Container angehängt. Häufig möchten Sie, dass mehrere Container an dasselbe Datenvolumen angehängt werden. Dies ist relativ einfach zu bewerkstelligen, aber es gibt einen kritischen Vorbehalt:Derzeit übernimmt Docker keine Dateisperrung. Wenn Sie mehrere Container benötigen, die auf das Volume schreiben, müssen die Anwendungen, die in diesen Containern ausgeführt werden, müssen darauf ausgelegt sein, in gemeinsam genutzte Datenspeicher zu schreiben, um Datenbeschädigungen zu verhindern.

Container4 und DataVolume4 erstellen

Verwenden Sie docker run um einen neuen Container mit dem Namen Container4 zu erstellen mit angehängtem Datenvolumen:

  1. docker run -ti --name=Container4 -v DataVolume4:/datavolume4 ubuntu

Als Nächstes erstellen Sie eine Datei und fügen Text hinzu:

  1. echo "This file is shared between containers" > /datavolume4/Example4.txt

Dann verlassen Sie den Container:

  1. exit

Dadurch kehren wir zur Host-Eingabeaufforderung zurück, wo Sie einen neuen Container erstellen, der das Datenvolume aus Container4 bereitstellt .

Container5 erstellen und Volumes von Container4 mounten

Sie werden Container5 erstellen , und mounten Sie die Volumes von Container4 :

  1. docker run -ti --name=Container5 --volumes-from Container4 ubuntu

Überprüfen Sie die Datenpersistenz:

  1. cat /datavolume4/Example4.txt
OutputThis file is shared between containers

Fügen Sie nun etwas Text aus Container5 hinzu :

  1. echo "Both containers can write to DataVolume4" >> /datavolume4/Example4.txt

Schließlich verlassen Sie den Container:

  1. exit

Als Nächstes überprüfen Sie, ob Ihre Daten immer noch in Container4 vorhanden sind .

In Container5 vorgenommene Änderungen anzeigen

Suchen Sie nun nach den Änderungen, die von Container5 auf das Datenvolumen geschrieben wurden durch Neustart von Container4 :

  1. docker start -ai Container4

Überprüfen Sie die Änderungen:

  1. cat /datavolume4/Example4.txt
OutputThis file is shared between containers
Both containers can write to DataVolume4

Nachdem Sie nun überprüft haben, dass beide Container das Datenvolumen lesen und schreiben konnten, verlassen Sie den Container:

  1. exit

Auch hier behandelt Docker keine Dateisperrung, also müssen Anwendungen Konto für die Dateisperrung selbst. Es ist möglich, ein Docker-Volume als schreibgeschützt bereitzustellen, um sicherzustellen, dass Daten nicht versehentlich beschädigt werden, wenn ein Container schreibgeschützten Zugriff erfordert, indem :ro hinzugefügt wird . Sie werden sich jetzt ansehen, wie das funktioniert.

Starten Sie Container 6 und mounten Sie das Volume schreibgeschützt

Sobald ein Volume in einem Container gemountet wurde, können Sie, anstatt es wie bei einem typischen Linux-Dateisystem zu unmounten, stattdessen einen neuen Container erstellen, der wie gewünscht gemountet wird, und bei Bedarf den vorherigen Container entfernen. Um das Volume schreibgeschützt zu machen, hängen Sie :ro an am Ende des Containernamens:

  1. docker run -ti --name=Container6 --volumes-from Container4:ro ubuntu

Sie überprüfen den schreibgeschützten Status, indem Sie versuchen, Ihre Beispieldatei zu entfernen:

  1. rm /datavolume4/Example4.txt
Outputrm: cannot remove '/datavolume4/Example4.txt': Read-only file system

Abschließend verlassen Sie den Container und bereinigen Ihre Testcontainer und -volumes:

  1. exit

Nachdem Sie fertig sind, bereinigen Sie Ihre Container und Ihr Volume:

  1. docker rm Container4 Container5 Container6
  2. docker volume rm DataVolume4

In diesem Beispiel haben Sie gezeigt, wie Sie Daten zwischen zwei Containern mithilfe eines Daten-Volumes teilen und wie Sie ein Daten-Volume als schreibgeschützt bereitstellen.

Schlussfolgerung

In diesem Lernprogramm haben Sie ein Datenvolume erstellt, mit dem Daten durch das Löschen eines Containers beibehalten werden konnten. Sie haben Datenvolumen zwischen Containern geteilt, mit der Einschränkung, dass Anwendungen so konzipiert sein müssen, dass sie Dateisperren handhaben, um Datenbeschädigungen zu verhindern. Schließlich haben Sie gezeigt, wie Sie ein freigegebenes Volume im schreibgeschützten Modus bereitstellen. Wenn Sie mehr über die gemeinsame Nutzung von Daten zwischen Containern und dem Hostsystem erfahren möchten, lesen Sie How To Share Data between the Docker Container and the Host.


Docker
  1. So installieren Sie Docker unter Ubuntu 18.04 / Ubuntu 18.10 / Ubuntu 19.04

  2. So teilen Sie Daten zwischen Docker-Containern unter Ubuntu 22.04

  3. So verwenden Sie Docker Compose

  4. So verbinden Sie Docker-Container

  5. So listen Sie Docker-Container auf

So installieren Sie Docker unter Ubuntu 14.04

So installieren Sie Docker Compose auf Ubuntu

So führen Sie Docker-Container aus

So entfernen Sie Docker-Container

So stoppen Sie Docker-Container

Wie teilt man Dateien zwischen Ubuntu und Windows 10?