Was sind Docker-Volumes und wie werden sie verwendet?

0
485

Standardmäßig sind Docker-Container vollständig zustandslos. Die auf dem Container gespeicherten Daten sind kurzlebig und werden beim Herunterfahren des Containers gelöscht. Dies ist offensichtlich für viele Anwendungen nicht ideal, daher bietet Docker einige Möglichkeiten, mit dem Status umzugehen.

Was sind Volumes?

Die einfachste Möglichkeit, Docker-Daten persistent zu machen, sind Bind-Mounts, die buchstäblich einen Speicherort auf der Festplatte des Hosts an einen Speicherort auf der Festplatte des Containers binden. Diese sind einfach zu erstellen und zu verwenden, aber ein wenig ruckelig, da Sie die Verzeichnisse einrichten und selbst verwalten müssen.

Volumes sind wie virtuelle Festplatten, die von Docker verwaltet werden. Docker übernimmt das Speichern auf der Festplatte (normalerweise in /var/lib/docker/volumes/) und gibt ihnen einen leicht einprägsamen einzelnen Namen anstelle eines Verzeichnispfads. Sie können mit der Docker-CLI ganz einfach erstellt und entfernt werden.

Diese haben neben der Verwaltung durch Docker noch einige andere Vorteile. Sie funktionieren sowohl auf Linux- als auch auf Windows-Containern, können sicherer zwischen mehreren Containern geteilt werden und die Volume-Treiber ermöglichen es Cloud-Anbietern, Remote-Hosting für die zugrunde liegenden Daten bereitzustellen. Insgesamt sind Volumes einfacher zu verwenden als Bind-Mounts und werden von Docker zum Verwalten des Status empfohlen.

Natürlich sollten Sie sich überlegen, ob Sie wirklich benötigen, um Docker-Daten auf dem Server zu speichern. Für viele Anwendungen reicht die Verwendung eines externen Remote-Datenspeichers wie Amazon S3 oder einer externen Datenbank aus, um die verwendeten Daten zu speichern, ohne sie auf dem Frontend-Server zu binden.

Wie verwenden Sie sie?

Sie können mit dem folgenden Befehl über die Befehlszeile ein neues Volume erstellen:

docker volume create nginx-config Advertisement

Und dann , wenn Sie Ihren Docker-Container ausführen möchten, verknüpfen Sie ihn mit dem –mount-Flag mit dem Ziel im Container:

docker run -d –name devtest –mount source=nginx-config,target=/etc/nginx nginx:latest

Wenn Sie docker inspect <name> ausführen, sehen Sie das Volume im Abschnitt Mounts aufgeführt.

Wenn Sie Docker Compose verwenden, ist die Einrichtung ebenfalls einfach. Fügen Sie einfach für jeden Containerdienst, den Sie haben, einen Volume-Eintrag hinzu und ordnen Sie dann einem Standort im Gast einen Volume-Namen zu. Sie müssen außerdem eine Liste der Volumes in einem Volume-Schlüssel der obersten Ebene bereitstellen, damit Compose bereitgestellt werden kann.

Version: “3.0” Dienste: Web: Image: nginx:neueste Ports: – “80:80” Volumes: – nginx-config:/etc/nginx/Volumes: nginx-config:

Dadurch wird das Volume automatisch erstellt für dieses Komponieren. Wenn Sie ein vorgefertigtes Volume von außerhalb von Compose verwenden möchten, geben Sie in der Volume-Konfiguration external: true an:

Volumes: cms-content: external: true

Wenn Sie stattdessen möchten Führen Sie einfach einen Bind-Mount durch und kümmern Sie sich nicht um Volumes, geben Sie einfach einen Pfadnamen anstelle des Volume-Namens ein und verzichten Sie auf die Definition der Volume-Namen.

Version: “3.0” Dienste: Web: Image: nginx:neueste Ports: – “80:80” Volumes: – /docker/nginx-config/:/etc/nginx/Werbung

Sie können Docker lesen&# 8217;s vollständige Dokumentation zur Verwendung von Volumes mit Compose, wenn Ihr Anwendungsfall etwas Spezielleres erfordert.

Docker-Volumes übertragen

Docker-Volumes sind einfach automatisch erstellte Ordner, die unter /var/lib/docker/volumes/gespeichert werden, wobei jedes Volume unter ./volumename/_data/gespeichert wird. Zum Sichern und Wiederherstellen können Sie diese Volumes einfach direkt sichern.

Wenn Sie stattdessen die Docker-CLI verwenden möchten, bieten diese leider keine einfache Möglichkeit dazu. Um die Volumes eines Containers zu sichern, benötigen Sie den Containernamen sowie den Mount-Speicherort, an dem die Daten gespeichert sind.

Die Vorgehensweise ist ein wenig a Hack —Sie müssen einen Befehl in einem neuen Docker-Container ausführen, das aktuelle Shell-Verzeichnis binden, das Volume in diesem Container mounten und dann das Verzeichnis in ein Backup tarnen. Am Ende erhalten Sie eine backup.tar des Volumes:

docker run –rm –volumes-from containername -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar/mountlocation

Dann können Sie das Archiv auf ähnliche Weise in das Zielverzeichnis entpacken:

docker run –rm –volumes-from containername -v $(pwd):/backup ubuntu bash -c “cd /mountlocation && tar xvf /backup/backup.tar –strip 1”

Dies ist jedoch immer noch besser, als den Host-Standort kennen zu müssen, sodass Sie dies automatisieren können, wenn Sie möchten.