Zum Hauptinhalt springen

Volumes

Volumes sind der bevorzugte Mechanismus zum Speichern von Daten, die von Docker-Containern erzeugt und verwendet werden. Während Bind-Mounts von der Verzeichnisstruktur und dem Betriebssystem des Hosts abhängig sind, werden Volumes vollständig von Docker verwaltet. Volumes haben mehrere Vorteile gegenüber Bind-Mounts:

  • Volumes sind einfacher zu sichern oder zu migrieren als Bind-Mounts.
  • Sie können Volumes mit Docker CLI-Befehlen oder der Docker API verwalten.
  • Volumes funktionieren mit Linux- und Windows-Containern.
  • Volumes können sicherer zwischen mehreren Containern geteilt werden.
  • Volume-Treiber ermöglichen es Ihnen, Volumes auf entfernten Hosts oder Cloud-Anbietern zu speichern, den Inhalt von Volumes zu verschlüsseln oder andere Funktionalitäten hinzuzufügen.
  • Neue Volumes können ihren Inhalt durch einen Container vorbelegt haben.
  • Volumes auf Docker Desktop haben eine viel höhere Leistung als Bind-Mounts von Mac- und Windows-Hosts.

Darüber hinaus sind Volumes oft eine bessere Wahl als das Speichern von Daten in einer beschreibbaren Schicht eines Containers, weil ein Volume die Größe der Container, die es verwenden, nicht erhöht und der Inhalt des Volumes unabhängig vom Lebenszyklus eines bestimmten Containers existiert.

Hinweis: Die Verwendung von Datenvolumes ist ähnlich wie das Einbinden eines Verzeichnisses oder einer Datei unter Linux. Die Dateien im als Einhängepunkt im Image angegebenen Verzeichnis werden auf das Datenvolume kopiert (nur wenn das Datenvolume leer ist).

Erstellen eines Datenvolumes

$ docker volume create my-vol

Alle Datenvolumes anzeigen

$ docker volume ls

DRIVER VOLUME NAME
local my-vol

Verwenden Sie den folgenden Befehl auf dem Host, um Informationen über ein spezifisches Datenvolume anzuzeigen

$ docker volume inspect my-vol
[
{
"Driver": "local",
"Labels": {},
"Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
"Name": "my-vol",
"Options": {},
"Scope": "local"
}
]

Starten eines Containers mit einem eingebundenen Datenvolume

Beim Verwenden des Befehls docker run verwenden Sie die Flagge --mount, um das Datenvolume in den Container einzubinden. Mehrere Datenvolumes können in einem einzigen docker run eingebunden werden.

Wir erstellen einen Container namens web und laden ein Datenvolume in das Verzeichnis /usr/share/nginx/html des Containers.

$ docker run -d -P \
--name web \
# -v my-vol:/usr/share/nginx/html \
--mount source=my-vol,target=/usr/share/nginx/html \
nginx:alpine

Spezifische Informationen zum Volume anzeigen

Verwenden Sie den folgenden Befehl auf dem Host, um Informationen über den web Container anzuzeigen.

$ docker inspect web

Die Informationen zum Datenvolume befinden sich unter dem Schlüssel "Mounts"

"Mounts": [
{
"Type": "volume",
"Name": "my-vol",
"Source": "/var/lib/docker/volumes/my-vol/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],

Volumes entfernen

$ docker volume rm my-vol

Volumes sind so konzipiert, dass sie Daten unabhängig vom Lebenszyklus des Containers speichern. Docker entfernt automatisch keine Datenvolumes, wenn Sie einen Container entfernen, noch gibt es einen Mechanismus zur Bereinigung von Datenvolumes, die nicht mehr von Containern referenziert werden. Wenn Sie ein Volume zusammen mit einem Container entfernen möchten, verwenden Sie beim Entfernen des Containers den Befehl docker rm -v.

Um alle ungenutzten Volumes zu entfernen und Speicherplatz freizugeben:

$ docker volume prune

Gute Anwendungsfälle für Volumes

Volumes sind die bevorzugte Methode, um Daten in Docker-Containern und -Diensten zu speichern. Einige Anwendungsfälle für Volumes umfassen:

  • Austausch von Daten zwischen mehreren laufenden Containern. Wenn Sie es nicht explizit erstellen, wird ein Volume das erste Mal erstellt, wenn es in einen Container eingebunden wird. Wenn dieser Container stoppt oder entfernt wird, existiert das Volume weiterhin. Mehrere Container können gleichzeitig dasselbe Volume einbinden, entweder im Lese-Schreib- oder im Nur-Lese-Modus. Volumes werden nur entfernt, wenn sie ausdrücklich entfernt werden.

  • Wenn nicht garantiert ist, dass der Docker-Host eine bestimmte Verzeichnis- oder Dateistruktur hat. Volumes helfen Ihnen, die Konfiguration des Docker-Hosts von der Containerlaufzeit zu entkoppeln.

  • Wenn Sie die Daten Ihres Containers auf einem entfernten Host oder einem Cloud-Anbieter speichern möchten, anstatt lokal.

  • Wenn Sie Daten von einem Docker-Host auf einen anderen sichern, wiederherstellen oder migrieren müssen, sind Volumes eine bessere Wahl. Sie können Container, die das Volume verwenden, stoppen und dann das Verzeichnis des Volumes sichern (zum Beispiel /var/lib/docker/volumes/<volume-name>).

  • Wenn Ihre Anwendung eine leistungsstarke I/O auf Docker Desktop erfordert. Volumes werden im Linux-VM gespeichert und nicht auf dem Host, was bedeutet, dass die Lese- und Schreibvorgänge eine viel geringere Latenz und einen höheren Durchsatz haben.

  • Wenn Ihre Anwendung ein vollständig natives Dateisystemverhalten auf Docker Desktop erfordert. Zum Beispiel benötigt eine Datenbank-Engine eine genaue Kontrolle über das Disk-Flushing, um die Transaktionsdauer zu garantieren. Volumes werden im Linux-VM gespeichert und können diese Garantien geben, während Bind-Mounts zu macOS oder Windows remoted werden, wo die Dateisysteme sich leicht unterscheiden.

Referenzen

Guter Anwendungsfall für Volumes