Standardmäßig sind Docker-Container völlig zustandslos. Die im Container gespeicherten Daten sind flüchtig und werden gelöscht, wenn der Container heruntergefahren wird. Dies ist offensichtlich für viele Anwendungen nicht ideal, daher bietet Docker einige Möglichkeiten, mit dem Zustand umzugehen.
Was sind Volumes?
Die einfachste Möglichkeit, Docker-Daten persistent zu machen, ist bind mounts , die einen Speicherort auf der Festplatte des Hosts buchstäblich an einen Speicherort auf der Festplatte des Containers binden. Diese sind einfach zu erstellen und zu verwenden, aber ein wenig umständlich, da Sie die Verzeichnisse selbst einrichten und 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 zu merkenden Einzelnamen anstelle eines Verzeichnispfads. Es ist einfach, sie mit der Docker-CLI zu erstellen und zu entfernen.
Diese haben neben der Verwaltung durch Docker noch einige weitere Vorteile. Sie funktionieren sowohl auf Linux- als auch auf Windows-Containern, können sicherer von mehreren Containern gemeinsam genutzt werden und die Volumentreiber 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 für die Statusverwaltung empfohlen.
Natürlich sollte man sich überlegen, ob Docker-Daten wirklich auf dem Server gespeichert werden müssen. 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 ein neues Volume über die Befehlszeile mit dem folgenden Befehl erstellen:
docker volume create nginx-config
Und wenn Sie dann Ihren Docker-Container ausführen, verknüpfen Sie ihn mit dem Ziel im Container mit --mount
Flagge:
docker run -d --name devtest --mount source=nginx-config,target=/etc/nginx nginx:latest
Wenn Sie docker inspect <name>
, sehen Sie das Volumen unter Mounts
aufgelistet Abschnitt.
Wenn Sie Docker Compose verwenden, ist die Einrichtung ebenfalls einfach. Fügen Sie einfach ein volumes
hinzu -Eintrag für jeden Containerdienst, den Sie haben, und ordnen Sie dann einen Volume-Namen einem Speicherort im Gast zu. Sie müssen auch eine Liste von Volumes in einem volumes
der obersten Ebene bereitstellen Schlüssel für Compose zur Bereitstellung.
version: "3.0" services: web: image: nginx:latest ports: - "80:80" volumes: - nginx-config:/etc/nginx/ volumes: nginx-config:
Dadurch wird das Volume für dieses Compose automatisch erstellt. Wenn Sie ein vorgefertigtes Volume außerhalb von Compose verwenden möchten, geben Sie external: true
an in der Volume-Konfiguration:
volumes: cms-content: external: true
Wenn Sie stattdessen einfach einen Bind-Mount durchführen und sich nicht um Volumes kümmern möchten, geben Sie einfach einen Pfadnamen anstelle des Volume-Namens ein und verzichten Sie auf die Definition der Volume-Namen.
version: "3.0" services: web: image: nginx:latest ports: - "80:80" volumes: - /docker/nginx-config/:/etc/nginx/
Sie können die vollständige Dokumentation von Docker zur Verwendung von Volumes mit Compose lesen, wenn Ihr Anwendungsfall etwas Spezifischeres erfordert.
Übertragen von Docker-Volumes
Docker-Volumes sind nur Ordner, die automatisch erstellt und 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 sie leider keine einfache Möglichkeit, dies zu tun. Um die Volumes eines Containers zu sichern, benötigen Sie den Containernamen sowie den Bereitstellungsort, an dem die Daten gespeichert sind.
Der Weg, dies zu tun, ist ein bisschen wie ein Hack – Sie müssen einen Befehl in einem neuen Docker-Container ausführen, das aktuelle Shell-Verzeichnis binden, mounten, das Volume in diesen Container mounten und dann tar
das Verzeichnis in ein Backup. Am Ende erhalten Sie eine backup.tar
des Volumens:
docker run --rm --volumes-from containername -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /mountlocation
Anschließend können Sie das Archiv analog 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.