Docker-Container-Volumes verstehen und verwalten
Docker ist eine Open-Source-Software zur Erstellung und Verwaltung von Containern. Mit einem Docker-Volume ist es möglich, Daten zwischen diesen Containern auszutauschen oder Daten aus einem Docker-Container persistent zu sichern.
Anforderungen
- Docker ist installiert und läuft.
- Sie haben grundlegende Kenntnisse der Docker-Funktionalität und Docker-Befehle.
Das Docker-Dateisystem
Um Docker-Volumes zu verstehen, ist es wichtig, zuerst einen Überblick darüber zu haben, wie das Docker-Dateisystem funktioniert.
Ein Docker-Image besteht aus mehreren schreibgeschützten Schichten. Wird ein Image aus einem Container gestartet, fügt Docker eine neue beschreibbare Schicht an der Spitze des Systems hinzu. Das wird in Docker Union File System genannt.
Jedes Mal, wenn eine Datei geändert wird, erstellt Docker eine Kopie der Datei von den schreibgeschützten Schichten bis in die oberste beschreibbare Schicht. Dadurch bleibt die ursprüngliche (schreibgeschützte) Datei unverändert.
Wird ein Container gelöscht, geht die oberste beschreibbare Schicht verloren. Das bedeutet, dass alle Änderungen, die nach dem Start des Containers vorgenommen wurden, nicht mehr vorhanden sind.
- Kostengünstige vCPUs und leistungsstarke dedizierte Cores
- Höchste Flexibilität ohne Mindestvertragslaufzeit
- Inklusive 24/7 Experten-Support
Abhilfe schaffen durch Docker-Volumes
Ein Container-Volume ermöglicht es, dass Daten erhalten bleiben, auch wenn ein Docker-Container gelöscht wird. Volumes sind auch eine praktische Möglichkeit, Daten zwischen dem Host und dem Container auszutauschen.
Das Einbinden eines Docker-Container-Volumes ist eine gute Lösung, um Folgendes auszuführen:
- Daten in einen Docker-Container übertragen
- Daten aus einem Docker-Container speichern
- Daten zwischen Docker-Containern austauschen
Docker-Volumes existieren außerhalb des Union File Systems mit seinen Read-only-Zugriff und seiner beschreibbaren Schicht. Das Volume ist ein Ordner, der zwischen dem Container und dem Host-Computer geteilt wird. Volumes können auch zwischen Containern geteilt werden.
Auf dem IONOS Cloud-Server können Sie Docker als bereits vorinstallierte Cloud-App auswählen. So können Sie von überall aus auf Ihre Anwendungen zugreifen!
Grundlage der Docker-Volumes
Ein Container-Volume „lebt“ außerhalb des eigentlichen Containers auf dem Host-Computer. Aus dem Container heraus verhält sich das Volume wie ein Ordner, in dem Sie Daten speichern und aus dem Sie Daten abrufen können. Es handelt sich hier um einen sogenannten Mount Point auf ein Verzeichnis auf dem Host.
Es gibt mehrere Möglichkeiten, Docker-Volumes zu erstellen und zu verwalten. Jede Methode hat ihre eigenen Vor- und Nachteile.
Verwendung des Befehls "volume create" von Docker
Ab der Version 1.9.0, die am 3.11.2015 veröffentlicht wurde, können Docker-Volumes ganz einfach mit dem integrierten Befehl docker volume erstellt und verwaltet werden.
Schritt 1: Volume erstellen und benennen
Der Befehl docker volume create erstellt ein benanntes Volume. Der Name ermöglicht es Ihnen, Docker-Volumes einfach zu finden und den Containern zuzuordnen.
Um ein Volume zu erstellen, verwenden Sie den Befehl:
sudo docker volume create - - name [volume name]
Schritt 2: Volume im Docker-Container verwenden
Um einen Container zu starten, der ein Volume verwendet, das Sie mit docker volume create erstellt haben, fügen Sie dem Befehl docker run das folgende Argument hinzu:
-v [volume name]:[container directory]
Um beispielsweise einen Container aus dem CentOS-Image mit dem Namen my-volume-test auszuführen und das Data-Volume dem Verzeichnis /data des Containers zuzuordnen, lautet der Befehl:
sudo docker run -it --name my-volume-test -v data-volume:/data centos /bin/bash
Schritt 3: Volumes auflisten
Um alle Docker-Volumes auf dem System aufzulisten, verwenden Sie den Befehl:
sudo docker volume ls
Dies gibt eine Liste aller Docker-Volumes zurück, die auf dem Host erstellt wurden.
Schritt 4: Volume inspizieren
Um ein benanntes Volume zu inspizieren, verwenden Sie den Befehl:
sudo docker volume inspect [volume name]
Dieser Befehl liefert Ihnen Informationen über das Volume, einschließlich des Mount Points und des Verzeichnisses auf dem Hostsystem, über das das Docker-Volume angesprochen werden kann.
Um zum Beispiel mehr Informationen über das Volume mit Namen „Data“ zu erhalten, das wir oben erstellt haben, ist der Befehl:
sudo docker volume inspect data-volume
Schritt 5: Volume entfernen
Um ein auf diese Weise erstelltes Volume zu entfernen, verwenden Sie den Befehl:
sudo docker volume rm [volume name]
Sie können ein Volume nicht entfernen, wenn es von einem vorhandenen Container verwendet wird. Bevor Sie das Volume entfernen können, müssen Sie den Docker-Container mit folgenden Befehlen anhalten und löschen:
sudo docker stop [container name or ID]
sudo docker rm [container name or ID]
Um beispielsweise das Volume namens „Data“ zu löschen, müssen Sie zuerst den Container, der es verwendet, mit my-volume-test stoppen und löschen:
sudo docker stop my-volume-test
sudo docker rm my-volume-test
Das Datenvolumen kann dann mit folgendem Befehl gelöscht werden:
sudo docker volume rm data-volume
Erstellen Sie ein Docker-Volume und geben Sie ein Verzeichnis auf dem Host an
Wenn Sie ein bestimmtes Verzeichnis auf Ihrem Host-Computer als Docker-Volume auf dem Container mounten möchten, fügen Sie das folgende Argument zu Ihrem docker run-Befehl hinzu:
-v [host directory]:[container directory]
Um beispielsweise einen neuen Container zu starten und den Ordner /webfiles auf dem Host dem Ordner /var/wwww/html auf dem Container zuzuordnen, lautet der Befehl:
sudo docker run -it -v /webfiles:/var/www/html centos /bin/bash
Testen Sie dies, indem Sie ein Verzeichnis erstellen, das Sie dann als Docker-Volume verwenden. Dies geht mit folgendem Befehl:
sudo mkdir /hostvolume
Fügen Sie mit dem Befehl eine kleine Testdatei zu diesem Verzeichnis hinzu:
sudo echo "Hello World" >> /hostvolume/host-hello.txt
Als nächstes starten Sie einen Container namens my-directory-test und ordnen /hostvolume auf dem Host /containervolume auf dem Container zu mit folgendem Befehl:
sudo docker run -it --name my-directory-test -v /hostvolume:/containervolume centos /bin/bash
Sobald Sie sich in der Eingabeaufforderung des neuen Containers befinden, listen Sie die Dateien im freigegebenen Volume mit dem Befehl auf:
ls /containervolume
Sie sehen die Datei host-hello.txt, die wir auf dem Host erstellt haben.
Dies funktioniert auch in die entgegengesetzte Richtung. Dateien, die Sie in dieses Verzeichnis legen, werden auf dem Host angezeigt. Sie können dies vom Container aus testen, indem Sie dem freigegebenen Volume mit folgendem Befehl eine weitere Datei hinzufügen:
echo "Hello from the container." >> /containervolume/container-hello.txt
Verlassen Sie den Container mit [Strg] + [P] und [Strg] + [Q] und kehren Sie zur Eingabeaufforderung des Host-Computers zurück. Dort listen Sie die Dateien im freigegebenen Volume mit diesem Befehl auf:
sudo ls /hostvolume
Sie sehen die beiden Testdateien, die wir vom Host und vom Container aus erstellt haben.
Erstellen eines Docker-Volumes mit einer Docker-Datei
Verwenden Sie den folgenden Befehl in einer Docker-Datei, um ein gemeinsames Speichervolumen im Container zu erstellen:
VOLUME [volume path]
Um beispielsweise ein Volume /myvolume in dem Container zu erstellen, der aus der Docker-Datei gestartet werden soll, lautet der Befehl:
VOLUME /myvolume
Um dies zu testen, erstellen Sie zunächst eine Datei namens Dockerfile mit dem Befehl:
sudo nano Dockerfile
Fügen Sie folgenden Inhalt in die Datei ein:
# The source image to start with
FROM centos
# Create a volume
VOLUME /dockerfilevolume
Speichern und beenden Sie die Datei.
Als nächstes erstellen Sie mit folgendem Befehl ein Image namens dockerfile-volumetest aus dieser Docker-Datei:
sudo docker build -t dockerfile-volumetest
Danach starten Sie einen Container namens my-dockerfile-test aus diesem Image mit dem Befehl:
sudo docker run --name my-dockerfile-test -it dockerfile-volumetest /bin/bash
Sobald Sie sich in der Eingabeaufforderung des neuen Containers befinden, erstellen Sie mit diesem Befehl eine kleine Testdatei im freigegebenen Volume:
echo "Hello World" >> /dockerfilevolume/dockerfile-container-hello.txt
Verlassen Sie den Container mit [Strg] + [P] und [Strg] + [Q] und kehren Sie zur Eingabeaufforderung des Host-Computers zurück.
Als nächstes suchen Sie den Mount Point. Verwenden Sie dazu den Befehl:
sudo docker inspect my-dockerfile-test
Scrollen Sie durch die Ausgabe, bis Sie einen Abschnitt mit dem Titel „Mounts“ finden, der ungefähr so aussieht:
Quelle/Source ist das Verzeichnis auf dem Host-Computer.
Ziel/Destination ist der Ordner auf dem Container.
Überprüfen Sie das Quellverzeichnis auf Ihrem Host-Computer. In dem Beispiel ist der Befehl:
sudo ls /var/lib/docker/volumes/30275034a424251a771c91b65ba44261a27f91e3f6af31097b5226b1f46bfe20/_data/test
Hier finden Sie die Datei dockerfile-container-hello.txt, die Sie auf dem Container erstellt haben.
Vor- und Nachteile der verschiedenen Methoden im Überblick
Methode | Vorteile | Nacheile |
Befehl „volume create“ | Schnelle und einfache Handhabung | Volume auf dem Host wird automatisch erstellt und nur ist schwer zu finden |
Docker-Volume mit Verzeichnis auf dem Host erstellen | Container kann bestimmtem Ordner des Hosts zugeordnet werden | Keine Benennung des Volumes und keine Automatisierung mittels Dockerfile möglich |
Erstellung mit Docker-Datei | Automatisierung des Prozesses | Keine Zuweisung eines Host-Ordners und keine Benennung des Volumes |
Teilen von Docker-Volumes zwischen Containern
Es gibt viele Situationen, in denen es sinnvoll ist, ein Docker-Volume zwischen Containern zu teilen, und mehrere Möglichkeiten, dieses Ziel zu erreichen.
Freigeben eines Volumes auf dem Host
Wenn Sie ein Volume auf dem Host-Computer erstellen, kann es von mehreren verschiedenen Containern gleichzeitig verwendet werden. Auf diese Weise können Sie Daten zwischen Containern und dem Host austauschen.
Für dieses Beispiel erstellen Sie ein Verzeichnis auf dem Host und verwenden dieses Verzeichnis als gemeinsames Volume zwischen zwei Containern.
Beginnen Sie, indem Sie mit folgendem Befehl ein Verzeichnis erstellen, das Sie als Docker-Volume verwenden können:
sudo mkdir /webdata
Erstellen Sie in diesem Verzeichnis mit diesem Befehl eine kleine Testdatei:
sudo echo "Hello from the host." >> /webdata/host-hello.txt
Als nächstes starten Sie einen Container mit dem Namen sql-database aus dem offiziellen PostgreSQL-Image und ordnen /webdata auf dem Host mit dem Befehl /data auf dem Container zu:
sudo docker run -it --name sql-database -v /webdata:/data postgres /bin/bash
Sobald Sie sich in der Eingabeaufforderung des neuen Containers befinden, überprüfen Sie, ob das freigegebene Volume mit dem Befehl korrekt eingerichtet ist:
ls /data
Sie sehen die Datei host-hello.txt, die wir auf dem Host erstellt haben. Fügen Sie mit folgendem Befehl eine Datei zum freigegebenen Volume hinzu:
echo "Hello from the sql-database container." >> /data/sql-hello.txt
Verlassen Sie den Container mit [Strg] + [P] und [Strg] + [Q] und kehren Sie zur Eingabeaufforderung des Host-Computers zurück.
Starten Sie nun einen Container namens „Webapp“ aus dem offiziellen PHP+Apache Image und ordnen Sie /webdata auf dem Host /var/www/html auf dem Container zu.
sudo docker run -it --name webapp -v /webdata:/var/www/html php:5.6-apache /bin/bash
Sobald Sie sich in der Eingabeaufforderung des neuen Containers befinden, überprüfen Sie mit folgendem Befehl, ob das freigegebene Volume korrekt eingerichtet wurde:
ls /var/www/html
Sie sehen sowohl die Datei host-hello.txt, die Sie auf dem Host erstellt haben, als auch die Datei sql-hello.txt, die Sie auf dem SQL-Datenbank-Container erstellt haben.
Fügen Sie jetzt eine Datei aus dem zuletzt erstellten Container hinzu:
echo "Hello from the webapp container." >> /var/www/html/webapp-hello.txt
Verlassen Sie den Container mit [Strg] + [P] und [Strg] + [Q] und kehren Sie zur Eingabeaufforderung des Host-Computers zurück. Auf dem Host können Sie sich alle drei Dateien mit folgendem Befehl anzeigen lassen:
sudo ls /webdata
Da sich die beiden Container nun ein Verzeichnis teilen, das auf dem Host „lebt“, können Daten sofort zwischen allen drei Standorten übertragen werden, indem sie einfach in dieses Verzeichnis verschoben werden.
Einen Container als gemeinsames Datenvolumen einrichten
Sie können auch einen separaten Container als gemeinsames Datenvolumen einrichten.
Dazu legen Sie zunächst den Datencontainer an. Wenn Sie dann den Container erstellen, der diesen Datencontainer verwenden soll, fügen Sie dem Befehl docker run das folgende Argument hinzu:
--volumes-from [name or ID of data container]
Dies funktioniert unabhängig davon, ob der Zielcontainer ausgeführt wird oder nicht. Docker-Volumes werden nie gelöscht und bleiben auch nach dem Stoppen des Containers erhalten.
Für dieses Beispiel erstellen Sie einen Datencontainer namens „Data-Storage“, der als Datenvolumen dient. Zusätzlich werden zwei weitere Container erstellt, die sich den Datencontainer als Speichervolumen teilen.
Starten Sie zunächst den Data-Storage-Container aus dem offiziellen CentOS-7-Image:
sudo docker run -it -v /shared-data --name data-storage centos /bin/bash
Fügen Sie dann eine kleine Datei zum Ordner /shared-data hinzu:
echo "Hello from the data-storage container." >> /shared-data/data-storage-hello.txt
Verlassen Sie den Container mit [Strg] + [P] und [Strg] + [Q] und kehren Sie zur Eingabeaufforderung des Host-Computers zurück.
Starten Sie nun den App-Container aus dem offiziellen Python-Image und mounten Sie den Datenspeicher-Container als Volume:
sudo docker run -it --name app --volumes-from data-storage python /bin/bash
Listen Sie die Dateien im freigegebenen Volume mit folgendem Befehl auf:
ls /shared-data
Wie Sie sehen können, wurde der Ordner /shared-data aus dem Ordner /shared-data auf dem Datenspeicher-Container gemountet und enthält die Datei data-storage-hello.txt.
Fügen Sie jetzt eine Datei aus dem App-Container hinzu:
echo "Hello from the app container." >> /shared-data/app-hello.txt
Verlassen Sie den Container mit [Strg] + [P] und [Strg] + [Q] und kehren Sie zur Eingabeaufforderung des Host-Computers zurück.
Starten Sie schließlich den Web-Container aus dem offiziellen Apache-Image und mounten Sie den Datenspeicher-Container als Volume:
sudo docker run -it --name web --volumes-from data-storage httpd /bin/bash
Listen Sie die Dateien im freigegebenen Volume mit diesem Befehl auf:
ls /shared-data
Sie sehen nun die von uns auf den Speicher- und App-Containern erstellten Dateien.
- 100 % Enterprise-Hardware
- Minutengenaue Abrechnung
- Nur bei uns: Cloud-Funktionen
Volume schreibgeschützt mounten
In diesem Artikel haben wir Volumes bisher mit Schreib-Lese-Zugriff erstellt bzw. gemountet.
Wenn Sie einen Container darauf beschränken möchten, nur Lesezugriff auf ein Volume zu haben, fügen Sie einfach :ro für „read-only“ zu dem in der -v-Anweisung angegebenen Containervolumen hinzu:
docker run -v /directory:/path:ro
Dies kann beispielsweise für Sicherheitszwecke nützlich sein. Auch wenn Sie sicherstellen möchten, dass die Daten in einem bestimmten Volume gegen versehentliches Überschreiben oder Löschen durch einen anderen Docker Container geschützt sind, ist der Read-only-Zugriff eine Überlegung wert.
Erstellen Sie z. B. ein Volume auf dem Host mit dem Namen limited-access mit folgendem Befehl:
sudo docker volume create --name limited-access
Führen Sie dann einen Container aus dem CentOS-Image mit dem Namen allowed-to-write aus und ordnen Sie das Volume „Limited-Access“ als normales (read-write) Volume zu:
sudo docker run -it --name allowed-to-write -v limited-access:/data centos /bin/bash
Sobald Sie sich an der Eingabeaufforderung dieses Containers befinden, erstellen Sie eine Testdatei mit dem Befehl:
echo "Hello from the container that is allowed to write." >> /data/hello.txt
Verlassen Sie den Container mit [Strg] + [P] und [Strg] + [Q] und kehren Sie zur Eingabeaufforderung des Host-Computers zurück.
Als nächstes führen Sie einen Container aus dem CentOS-Image mit dem Namen not-allowed-to-write aus und ordnen diesem das Volume Limited-Access als Read-only-Volume zu:
sudo docker run -it --name not-allowed-to-write -v limited-access:/data:ro centos /bin/bash
Wenn Sie versuchen, eine Testdatei auf dem freigegebenen Volume mit einem Befehl wie diesem zu erstellen:
echo "Hello from the container that is not allowed to write." >> /data/no-access.txt
erhalten Sie einen Fehler, der erklärt, dass dieser Container keinen Schreibzugriff auf dieses Verzeichnis hat.
bash: /data/no-access.txt: Read-only file system