Docker ist eine Open-Source-Software zur Er­stel­lung und Ver­wal­tung von Con­tai­nern. Mit einem Docker-Volume ist es möglich, Daten zwischen diesen Con­tai­nern aus­zu­tau­schen oder Daten aus einem Docker-Container per­sis­tent zu sichern.

An­for­de­run­gen

Das Docker-Da­tei­sys­tem

Um Docker-Volumes zu verstehen, ist es wichtig, zuerst einen Überblick darüber zu haben, wie das Docker-Da­tei­sys­tem funk­tio­niert.

Ein Docker-Image besteht aus mehreren schreib­ge­schütz­ten Schichten. Wird ein Image aus einem Container gestartet, fügt Docker eine neue be­schreib­ba­re 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 schreib­ge­schütz­ten Schichten bis in die oberste be­schreib­ba­re Schicht. Dadurch bleibt die ur­sprüng­li­che (schreib­ge­schütz­te) Datei un­ver­än­dert.

Wird ein Container gelöscht, geht die oberste be­schreib­ba­re Schicht verloren. Das bedeutet, dass alle Än­de­run­gen, die nach dem Start des Con­tai­ners vor­ge­nom­men wurden, nicht mehr vorhanden sind.

Compute Engine
Die ideale IaaS für Ihre Workloads
  • Kos­ten­güns­ti­ge vCPUs und leis­tungs­star­ke de­di­zier­te Cores
  • Höchste Fle­xi­bi­li­tät ohne Min­dest­ver­trags­lauf­zeit
  • Inklusive 24/7 Experten-Support

Abhilfe schaffen durch Docker-Volumes

Ein Container-Volume er­mög­licht es, dass Daten erhalten bleiben, auch wenn ein Docker-Container gelöscht wird. Volumes sind auch eine prak­ti­sche Mög­lich­keit, Daten zwischen dem Host und dem Container aus­zu­tau­schen.

Das Einbinden eines Docker-Container-Volumes ist eine gute Lösung, um Folgendes aus­zu­füh­ren:

  • Daten in einen Docker-Container über­tra­gen
  • Daten aus einem Docker-Container speichern
  • Daten zwischen Docker-Con­tai­nern aus­tau­schen

Docker-Volumes exis­tie­ren außerhalb des Union File Systems mit seinen Read-only-Zugriff und seiner be­schreib­ba­ren Schicht. Das Volume ist ein Ordner, der zwischen dem Container und dem Host-Computer geteilt wird. Volumes können auch zwischen Con­tai­nern geteilt werden.

Tipp

Auf dem IONOS Cloud-Server können Sie Docker als bereits vor­in­stal­lier­te Cloud-App auswählen. So können Sie von überall aus auf Ihre An­wen­dun­gen zugreifen!

Grundlage der Docker-Volumes

Ein Container-Volume „lebt“ außerhalb des ei­gent­li­chen Con­tai­ners 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 so­ge­nann­ten Mount Point auf ein Ver­zeich­nis auf dem Host.

Es gibt mehrere Mög­lich­kei­ten, Docker-Volumes zu erstellen und zu verwalten. Jede Methode hat ihre eigenen Vor- und Nachteile.

Ver­wen­dung des Befehls "volume create" von Docker

Ab der Version 1.9.0, die am 3.11.2015 ver­öf­fent­licht wurde, können Docker-Volumes ganz einfach mit dem in­te­grier­ten Befehl docker volume erstellt und verwaltet werden.

Schritt 1: Volume erstellen und benennen

Der Befehl docker volume create erstellt ein benanntes Volume. Der Name er­mög­licht es Ihnen, Docker-Volumes einfach zu finden und den Con­tai­nern zu­zu­ord­nen.

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 bei­spiels­wei­se einen Container aus dem CentOS-Image mit dem Namen my-volume-test aus­zu­füh­ren und das Data-Volume dem Ver­zeich­nis /data des Con­tai­ners zu­zu­ord­nen, 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 auf­zu­lis­ten, 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 in­spi­zie­ren

Um ein benanntes Volume zu in­spi­zie­ren, verwenden Sie den Befehl:

sudo docker volume inspect [volume name]

Dieser Befehl liefert Ihnen In­for­ma­tio­nen über das Volume, ein­schließ­lich des Mount Points und des Ver­zeich­nis­ses auf dem Host­sys­tem, über das das Docker-Volume an­ge­spro­chen werden kann.

Um zum Beispiel mehr In­for­ma­tio­nen ü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 er­stell­tes Volume zu entfernen, verwenden Sie den Befehl:

sudo docker volume rm [volume name]

Sie können ein Volume nicht entfernen, wenn es von einem vor­han­de­nen 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 bei­spiels­wei­se 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 Da­ten­vo­lu­men kann dann mit folgendem Befehl gelöscht werden:

sudo docker volume rm data-volume

Erstellen Sie ein Docker-Volume und geben Sie ein Ver­zeich­nis auf dem Host an

Wenn Sie ein be­stimm­tes Ver­zeich­nis 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 bei­spiels­wei­se einen neuen Container zu starten und den Ordner /webfiles auf dem Host dem Ordner /var/wwww/html auf dem Container zu­zu­ord­nen, lautet der Befehl:

sudo docker run -it -v /webfiles:/var/www/html centos /bin/bash

Testen Sie dies, indem Sie ein Ver­zeich­nis 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 Ver­zeich­nis hinzu:

sudo echo "Hello World" >> /hostvolume/host-hello.txt

Als nächstes starten Sie einen Container namens my-directory-test und ordnen /host­vo­lu­me auf dem Host /con­tai­ner­vo­lu­me 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 Ein­ga­be­auf­for­de­rung des neuen Con­tai­ners befinden, listen Sie die Dateien im frei­ge­ge­be­nen Volume mit dem Befehl auf:

ls /containervolume

Sie sehen die Datei host-hello.txt, die wir auf dem Host erstellt haben.

Dies funk­tio­niert auch in die ent­ge­gen­ge­setz­te Richtung. Dateien, die Sie in dieses Ver­zeich­nis legen, werden auf dem Host angezeigt. Sie können dies vom Container aus testen, indem Sie dem frei­ge­ge­be­nen Volume mit folgendem Befehl eine weitere Datei hin­zu­fü­gen:

echo "Hello from the container." >> /containervolume/container-hello.txt

Verlassen Sie den Container mit [Strg] + [P] und [Strg] + [Q] und kehren Sie zur Ein­ga­be­auf­for­de­rung des Host-Computers zurück. Dort listen Sie die Dateien im frei­ge­ge­be­nen Volume mit diesem Befehl auf:

sudo ls /hostvolume

Sie sehen die beiden Test­da­tei­en, 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 ge­mein­sa­mes Spei­cher­vo­lu­men im Container zu erstellen:

VOLUME [volume path]

Um bei­spiels­wei­se 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 Do­cker­file 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 do­cker­file-vo­lu­me­test aus dieser Docker-Datei:

sudo docker build -t dockerfile-volumetest

Danach starten Sie einen Container namens my-do­cker­file-test aus diesem Image mit dem Befehl:

sudo docker run --name my-dockerfile-test -it dockerfile-volumetest /bin/bash

Sobald Sie sich in der Ein­ga­be­auf­for­de­rung des neuen Con­tai­ners befinden, erstellen Sie mit diesem Befehl eine kleine Testdatei im frei­ge­ge­be­nen Volume:

echo "Hello World" >> /dockerfilevolume/dockerfile-container-hello.txt

Verlassen Sie den Container mit [Strg] + [P] und [Strg] + [Q] und kehren Sie zur Ein­ga­be­auf­for­de­rung 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 Ver­zeich­nis auf dem Host-Computer.

Ziel/De­sti­na­ti­on ist der Ordner auf dem Container.

Über­prü­fen Sie das Quell­ver­zeich­nis auf Ihrem Host-Computer. In dem Beispiel ist der Befehl:

sudo ls  /var/lib/docker/volumes/30275034a424251a771c91b65ba44261a27f91e3f6af31097b5226b1f46bfe20/_data/test

Hier finden Sie die Datei do­cker­file-container-hello.txt, die Sie auf dem Container erstellt haben.

Vor- und Nachteile der ver­schie­de­nen Methoden im Überblick

Methode Vorteile Nacheile
Befehl „volume create“ Schnelle und einfache Hand­ha­bung Volume auf dem Host wird au­to­ma­tisch erstellt und nur ist schwer zu finden
Docker-Volume mit Ver­zeich­nis auf dem Host erstellen Container kann be­stimm­tem Ordner des Hosts zu­ge­ord­net werden Keine Benennung des Volumes und keine Au­to­ma­ti­sie­rung mittels Do­cker­file möglich
Er­stel­lung mit Docker-Datei Au­to­ma­ti­sie­rung des Prozesses Keine Zuweisung eines Host-Ordners und keine Benennung des Volumes

Teilen von Docker-Volumes zwischen Con­tai­nern

Es gibt viele Si­tua­tio­nen, in denen es sinnvoll ist, ein Docker-Volume zwischen Con­tai­nern zu teilen, und mehrere Mög­lich­kei­ten, dieses Ziel zu erreichen.

Freigeben eines Volumes auf dem Host

Wenn Sie ein Volume auf dem Host-Computer erstellen, kann es von mehreren ver­schie­de­nen Con­tai­nern gleich­zei­tig verwendet werden. Auf diese Weise können Sie Daten zwischen Con­tai­nern und dem Host aus­tau­schen.

Für dieses Beispiel erstellen Sie ein Ver­zeich­nis auf dem Host und verwenden dieses Ver­zeich­nis als ge­mein­sa­mes Volume zwischen zwei Con­tai­nern.

Beginnen Sie, indem Sie mit folgendem Befehl ein Ver­zeich­nis erstellen, das Sie als Docker-Volume verwenden können:

sudo mkdir /webdata

Erstellen Sie in diesem Ver­zeich­nis 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 of­fi­zi­el­len Post­greS­QL-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 Ein­ga­be­auf­for­de­rung des neuen Con­tai­ners befinden, über­prü­fen Sie, ob das frei­ge­ge­be­ne Volume mit dem Befehl korrekt ein­ge­rich­tet 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 frei­ge­ge­be­nen 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 Ein­ga­be­auf­for­de­rung des Host-Computers zurück.

Starten Sie nun einen Container namens „Webapp“ aus dem of­fi­zi­el­len 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 Ein­ga­be­auf­for­de­rung des neuen Con­tai­ners befinden, über­prü­fen Sie mit folgendem Befehl, ob das frei­ge­ge­be­ne Volume korrekt ein­ge­rich­tet 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 er­stell­ten 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 Ein­ga­be­auf­for­de­rung 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 Ver­zeich­nis teilen, das auf dem Host „lebt“, können Daten sofort zwischen allen drei Stand­or­ten über­tra­gen werden, indem sie einfach in dieses Ver­zeich­nis ver­scho­ben werden.

Einen Container als ge­mein­sa­mes Da­ten­vo­lu­men ein­rich­ten

Sie können auch einen separaten Container als ge­mein­sa­mes Da­ten­vo­lu­men ein­rich­ten.

Dazu legen Sie zunächst den Da­ten­con­tai­ner an. Wenn Sie dann den Container erstellen, der diesen Da­ten­con­tai­ner verwenden soll, fügen Sie dem Befehl docker run das folgende Argument hinzu:

--volumes-from [name or ID of data container]
Hinweis

Dies funk­tio­niert un­ab­hän­gig davon, ob der Ziel­con­tai­ner aus­ge­führt wird oder nicht. Docker-Volumes werden nie gelöscht und bleiben auch nach dem Stoppen des Con­tai­ners erhalten.

Für dieses Beispiel erstellen Sie einen Da­ten­con­tai­ner namens „Data-Storage“, der als Da­ten­vo­lu­men dient. Zu­sätz­lich werden zwei weitere Container erstellt, die sich den Da­ten­con­tai­ner als Spei­cher­vo­lu­men teilen.

Starten Sie zunächst den Data-Storage-Container aus dem of­fi­zi­el­len 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 Ein­ga­be­auf­for­de­rung des Host-Computers zurück.

Starten Sie nun den App-Container aus dem of­fi­zi­el­len Python-Image und mounten Sie den Da­ten­spei­cher-Container als Volume:

sudo docker run -it --name app --volumes-from data-storage python /bin/bash

Listen Sie die Dateien im frei­ge­ge­be­nen 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 Da­ten­spei­cher-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 Ein­ga­be­auf­for­de­rung des Host-Computers zurück.

Starten Sie schließ­lich den Web-Container aus dem of­fi­zi­el­len Apache-Image und mounten Sie den Da­ten­spei­cher-Container als Volume:

sudo docker run -it --name web --volumes-from data-storage httpd /bin/bash

Listen Sie die Dateien im frei­ge­ge­be­nen Volume mit diesem Befehl auf:

ls /shared-data

Sie sehen nun die von uns auf den Speicher- und App-Con­tai­nern er­stell­ten Dateien.

Dedicated Server
De­di­zier­te Server mit mo­derns­ten Pro­zes­so­ren
  • 100 % En­ter­pri­se-Hardware
  • Kon­fi­gu­rier­ba­re Hardware-Aus­stat­tung
  • ISO-zer­ti­fi­zier­te Re­chen­zen­tren

Volume schreib­ge­schützt mounten

In diesem Artikel haben wir Volumes bisher mit Schreib-Lese-Zugriff erstellt bzw. gemountet.

Wenn Sie einen Container darauf be­schrän­ken möchten, nur Le­se­zu­griff auf ein Volume zu haben, fügen Sie einfach :ro für „read-only“ zu dem in der -v-Anweisung an­ge­ge­be­nen Con­tai­ner­vo­lu­men hinzu:

docker run -v /directory:/path:ro

Dies kann bei­spiels­wei­se für Si­cher­heits­zwe­cke nützlich sein. Auch wenn Sie si­cher­stel­len möchten, dass die Daten in einem be­stimm­ten Volume gegen ver­se­hent­li­ches Über­schrei­ben oder Löschen durch einen anderen Docker Container geschützt sind, ist der Read-only-Zugriff eine Über­le­gung 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 Ein­ga­be­auf­for­de­rung dieses Con­tai­ners 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 Ein­ga­be­auf­for­de­rung 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 frei­ge­ge­be­nen 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 Schreib­zu­griff auf dieses Ver­zeich­nis hat.

bash: /data/no-access.txt: Read-only file system
Zum Hauptmenü