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 :
- 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:
- docker run -ti --rm -v DataVolume1:/datavolume1 ubuntu
Schreiben Sie im Container einige Daten auf das Volume:
- 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.
- exit
Sie können mit docker volume inspect
überprüfen, ob das Volume auf Ihrem System vorhanden ist :
- 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 :
- docker run --rm -ti -v DataVolume1:/datavolume1 ubuntu
Überprüfen Sie den Inhalt:
- cat /datavolume1/Example1.txt
OutputExample1
Beenden Sie den Container:
- 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:
- 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 Namenpath
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:
- echo "Example2" > /datavolume2/Example2.txt
- cat /datavolume2/Example2.txt
OutputExample2
Beenden Sie den Container:
- exit
Wenn Sie den Container neu starten, wird das Volume automatisch bereitgestellt:
- docker start -ai Container2
Stellen Sie sicher, dass das Volume tatsächlich gemountet wurde und Ihre Daten noch vorhanden sind:
- cat /datavolume2/Example2.txt
OutputExample2
Zum Schluss beenden und bereinigen:
- exit
Docker lässt uns ein Volume nicht entfernen, wenn es von einem Container referenziert wird. Um zu sehen, was passiert, versuchen Sie Folgendes:
- 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:
- 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 :
- docker volume ls
OutputDRIVER VOLUME NAME
local DataVolume2
Und Sie können docker volume rm
verwenden um es zu entfernen:
- 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:
- 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:
- 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:
- 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:
- docker run -ti --name=Container4 -v DataVolume4:/datavolume4 ubuntu
Als Nächstes erstellen Sie eine Datei und fügen Text hinzu:
- echo "This file is shared between containers" > /datavolume4/Example4.txt
Dann verlassen Sie den Container:
- 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
:
- docker run -ti --name=Container5 --volumes-from Container4 ubuntu
Überprüfen Sie die Datenpersistenz:
- cat /datavolume4/Example4.txt
OutputThis file is shared between containers
Fügen Sie nun etwas Text aus Container5
hinzu :
- echo "Both containers can write to DataVolume4" >> /datavolume4/Example4.txt
Schließlich verlassen Sie den Container:
- 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
:
- docker start -ai Container4
Überprüfen Sie die Änderungen:
- 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:
- 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:
- docker run -ti --name=Container6 --volumes-from Container4:ro ubuntu
Sie überprüfen den schreibgeschützten Status, indem Sie versuchen, Ihre Beispieldatei zu entfernen:
- 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:
- exit
Nachdem Sie fertig sind, bereinigen Sie Ihre Container und Ihr Volume:
- docker rm Container4 Container5 Container6
- 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.