Docker-Datenvolumen im Vergleich zum gemounteten Hostverzeichnis


73

Wir können ein Datenvolumen im Docker haben:

$ docker run -v /path/to/data/in/container --name test_container debian
$ docker inspect test_container
...
Mounts": [
    {
        "Name": "fac362...80535",
        "Source": "/var/lib/docker/volumes/fac362...80535/_data",
        "Destination": "/path/to/data/in/container",
        "Driver": "local",
        "Mode": "",
        "RW": true
    }
]
...

Aber wenn das Datenvolumen darin lebt /var/lib/docker/volumes/fac362...80535/_data, unterscheidet es sich davon, dass die Daten in einem Ordner mit gemountet werden -v /path/to/data/in/container:/home/user/a_good_place_to_have_data?

Antworten:


50

Unterscheidet es sich von der Bereitstellung der Daten in einem Ordner, der mit -v / path / to / data / in / container: / home / user / a_good_place_to_have_data bereitgestellt wurde?

Dies liegt daran, wie unter " Mounten eines Host-Verzeichnisses als Datenvolumen " erwähnt.

Das Host-Verzeichnis ist von Natur aus hostabhängig. Aus diesem Grund können Sie kein Hostverzeichnis aus Dockerfile bereitstellen, da erstellte Images portabel sein sollten. Ein Hostverzeichnis wäre nicht auf allen potenziellen Hosts verfügbar.

Wenn Sie über persistente Daten verfügen, die Sie zwischen Containern teilen oder aus nicht persistenten Containern verwenden möchten, erstellen Sie am besten einen benannten Datenvolumencontainer und hängen die Daten daraus ein.

Sie können beide Ansätze kombinieren:

 docker run --volumes-from dbdata -v $(pwd):/backup ubuntu tar cvf /backup/backup.tar /dbdata

Hier haben wir einen neuen Container gestartet und das Volume aus dem dbdataContainer gemountet .
Wir haben dann ein lokales Hostverzeichnis als bereitgestellt /backup.
Schließlich haben wir einen Befehl übergeben, mit tardem der Inhalt des dbdataVolumes in einer backup.tarDatei in unserem /backupVerzeichnis gesichert wird . Wenn der Befehl abgeschlossen ist und der Container stoppt, wird eine Sicherungskopie unseres dbdataVolumes erstellt.


2
Können Sie klarstellen, was die Docker-Dokumentation bedeutet, dass Host-Verzeichnisse hostabhängig sind ? Sind Dateiberechtigungen gemeint, weil das Replizieren auf einem anderen Host in einigen Fällen schwierig ist, wenn Sie einen Container und das bereitgestellte Verzeichnis auf einen anderen Host verschieben? Was ist auch der Unterschied zwischen benannten Volumes und gemounteten Verzeichnissen? Ich verstehe, dass insbesondere die gemeinsame Nutzung persistenter Daten zwischen mehreren Containern ein Anwendungsfall für Container mit Datenvolumen ist. Aber bei persistenten Daten, die nur für einen einzelnen Container relevant sind, bin ich etwas verloren :-).
PermaFrost

3
@PermaFrost hostabhängig bedeutet, dass Sie keine Docker-Datei mit einem Volume-Pfad vom Host aus schreiben können, da diese Docker-Datei auf jedem Host mit jeweils eigenen Merkmalen erstellt werden kann: Ein auf einem Host gültiger Pfad ist möglicherweise auf einem anderen Host nicht verfügbar. Aus diesem Grund ist das Mounten eines Host-Ordners eine Laufzeitoperation (Docker-Ausführung) und keine Kompilierungsoperation (Docker-Build)
VonC

3
@PermaFrost Ein benanntes Volume ist hostunabhängig und persistent. Selbst für nur einen Container bedeutet dies, dass ich ein benanntes Volume auf jedem Host exportieren und wiederherstellen kann. Siehe madcoda.com/2016/03/docker-named-volume-explained
VonC

Vielen Dank für die Erklärung und den Link, ich werde mir diesen Artikel ansehen! :)
PermaFrost

@VonC: Können Sie klarstellen, was der Unterschied zwischen dem Erstellen eines lvm auf dem Hostsystem und dem Mounten auf Docker und der Verwendung des Docker-Plugins zum Erstellen und Mounten des lvm ist? Sollte einer dem anderen vorgezogen werden?
user1050619

79

Obwohl es sich bei der Verwendung gleich anfühlt, gibt es bei der einzigen Änderung des Speicherorts des Verzeichnisses einen anderen.

Volumes vs Bind Mounts

  • Mit Bind Montage, eine Datei oder ein Verzeichnis auf dem Host - Rechner in einen Behälter montiert ist . Auf die Datei oder das Verzeichnis wird durch ihren vollständigen oder relativen Pfad auf dem Hostcomputer verwiesen.
  • Mit Volume wird ein neues Verzeichnis im Docker-Speicherverzeichnis auf dem Hostcomputer erstellt, und Docker verwaltet den Inhalt dieses Verzeichnisses.

Volumenvorteile gegenüber Bindungshalterungen:

  • Volumes lassen sich leichter sichern oder migrieren als Bindungs-Mounts.
  • Sie können Volumes mithilfe von Docker CLI-Befehlen oder der Docker-API verwalten.
  • Volumes funktionieren sowohl unter Linux- als auch unter Windows-Containern.
  • Volumes können sicherer von mehreren Containern gemeinsam genutzt werden.
  • Mit Volume-Treibern können Sie Volumes auf Remote-Hosts oder Cloud-Anbietern speichern, den Inhalt von Volumes verschlüsseln oder andere Funktionen hinzufügen.
  • Der Inhalt eines neuen Volumes kann von einem Container vorab ausgefüllt werden.

BEARBEITEN (9.9.2019):
Laut @ Sebi2020-Kommentar sind Bind-Mounts viel einfacher zu sichern. Docker bietet keinen Befehl zum Sichern von Volumes. Sie müssen temporäre Container mit einem Bind-Mount verwenden, um Sicherungen zu erstellen.

Bände

Erstellt und verwaltet von Docker. Sie können ein Volume explizit mit dem Befehl docker volume create erstellen, oder Docker kann ein Volume während der Container- oder Serviceerstellung erstellen.

Wenn Sie ein Volume erstellen, wird es in einem Verzeichnis auf dem Docker-Host gespeichert. Wenn Sie das Volume in einen Container einbinden, wird dieses Verzeichnis in den Container eingehängt. Dies ähnelt der Funktionsweise von Bindungs-Mounts, außer dass Volumes von Docker verwaltet und von der Kernfunktionalität des Host-Computers isoliert werden.

Ein bestimmtes Volumen kann gleichzeitig in mehrere Container eingebaut werden. Wenn kein laufender Container ein Volume verwendet, steht das Volume Docker weiterhin zur Verfügung und wird nicht automatisch entfernt. Sie können nicht verwendete Volumes mit Docker Volume Prune entfernen.

Wenn Sie ein Volume bereitstellen, kann es benannt oder anonym sein. Anonyme Volumes erhalten keinen expliziten Namen, wenn sie zum ersten Mal in einen Container eingebunden werden. Docker gibt ihnen daher einen zufälligen Namen, der innerhalb eines bestimmten Docker-Hosts garantiert eindeutig ist. Neben dem Namen verhalten sich benannte und anonyme Volumes gleich.

Volumes unterstützen auch die Verwendung von Volume-Treibern, mit denen Sie Ihre Daten unter anderem auf Remote-Hosts oder Cloud-Anbietern speichern können.

Geben Sie hier die Bildbeschreibung ein

Binden Sie die Halterungen

Verfügbar seit den Anfängen von Docker. Bindungshalterungen haben im Vergleich zu Volumes eine eingeschränkte Funktionalität. Wenn Sie einen Bind-Mount verwenden, wird eine Datei oder ein Verzeichnis auf dem Host-Computer in einen Container eingebunden. Auf die Datei oder das Verzeichnis wird durch ihren vollständigen Pfad auf dem Hostcomputer verwiesen. Die Datei oder das Verzeichnis muss nicht bereits auf dem Docker-Host vorhanden sein. Es wird bei Bedarf erstellt, wenn es noch nicht vorhanden ist. Bindungs-Mounts sind sehr leistungsfähig, setzen jedoch voraus, dass das Dateisystem des Host-Computers über eine bestimmte Verzeichnisstruktur verfügt. Wenn Sie neue Docker-Anwendungen entwickeln, sollten Sie stattdessen benannte Volumes verwenden. Sie können Docker CLI-Befehle nicht verwenden, um Bindungs-Mounts direkt zu verwalten.

Geben Sie hier die Bildbeschreibung ein

Es gibt auch tmpfs mounts.
tmpfs wird montiert

Ein tmpfs-Mount wird weder auf dem Docker-Host noch in einem Container auf der Festplatte beibehalten. Es kann von einem Container während der Lebensdauer des Containers verwendet werden, um nicht persistenten Status oder vertrauliche Informationen zu speichern. Intern verwenden Schwarmdienste beispielsweise tmpfs-Bereitstellungen, um Geheimnisse in die Container eines Dienstes einzubinden.
Geben Sie hier die Bildbeschreibung ein

Referenz:
https://docs.docker.com/storage/


7
Bindungshalterungen sind viel einfacher zu sichern. Docker bietet leider keinen Befehl zum Sichern von Volumes an. Sie müssen temporäre Container mit einem Bind-Mount verwenden, um Backups zu erstellen
Sebi2020

2
Ich wollte gerade fragen, warum es einfacher ist, Volumes zu sichern, aber @ Sebi2020 fragte zuerst. Ich denke, es ist fair, die Antwort zu bearbeiten.
Bora M. Alper

Ich zweite @ Sebi2020. Ich kam hierher, als ich nach Möglichkeiten suchte, Volumes zu sichern, und fand sie unnötig kompliziert zu sichern (im Gegensatz zu dem, was ich intuitiv gedacht hatte). Bindungshalterungen sind viel einfacher zu sichern.
Dojo

Ich bin hierher gekommen und habe auch danach gesucht. Ich sehe einen großen Nachteil von Volume-Mounts darin, dass ich für eine ältere Docker-Version zuerst die aktuelle Version entfernen musste, als ich sie aktualisieren wollte. Dadurch wurden auch alle Docker-Daten (Bilder, Container, Volumes) entfernt. Ich bin mir nicht sicher, ob dies mit einem Upgrade nie wieder passieren wird. Und ich stimme zu, dass Bindungs-Mounts viel einfacher zu sichern sind. Sie wissen genau, wo sich die Daten befinden. Es wäre schön, wenn die Docker-Dokumentation die sogenannten Vorteile von Volumes gegenüber Bind-Mounts näher erläutern würde.
Tallandtree

Und was Windows Docker-Volumes betrifft: Es gibt eine Menge, die auf einem Windows Docker-Host in Bezug auf Volumes nicht funktioniert. Das ist also auch kein Vorteil.
Tallandtree

16

Ja, das ist aus einigen Perspektiven ganz anders. Wie Sie im Titel der Frage geschrieben haben, geht es darum zu verstehen, warum wir Datenmengen benötigen, anstatt Mount an Host zu binden.

Teil 1 - Grundlegende Szenarien mit Beispielen

Nehmen wir zwei Szenarien.

Fall 1: Webserver.
Wir möchten unserem Webserver eine Konfigurationsdatei zur Verfügung stellen, die sich häufig ändert.
Beispiel: Anzeigen von Ports gemäß der aktuellen Umgebung.
Wir können das Image jedes Mal mit dem entsprechenden Setup neu erstellen oder 2 verschiedene Images für jede Umgebung erstellen. Beide Lösungen sind nicht sehr effizient.

Mit Bind Mounts stellt Docker das angegebene Quellverzeichnis an einem Ort im Container bereit.
(Das ursprüngliche Verzeichnis / die ursprüngliche Datei in der schreibgeschützten Ebene im Union-Dateisystem wird einfach überschrieben.)

Beispiel: Binden eines dynamischen Ports an nginx:

version: "3.7"
services:
  web:
    image: nginx:alpine
    volumes:
     - type: bind #<-----Notice the type
       source: ./mysite.template
       target: /etc/nginx/conf.d/mysite.template
    ports:
     - "9090:8080"
    environment:
     - PORT=8080
    command: /bin/sh -c "envsubst < /etc/nginx/conf.d/mysite.template > 
        /etc/nginx/conf.d/default.conf && exec nginx -g 'daemon off;'"

(*) Beachten Sie, dass dieses Beispiel auch mit Volumes gelöst werden kann.

Fall 2: Datenbanken.
Docker-Container speichern keine persistenten Daten: Alle Daten, die in die beschreibbare Ebene im Union-Dateisystem des Containers geschrieben werden, gehen verloren, sobald der Container nicht mehr ausgeführt wird.

Aber was ist, wenn auf einem Container eine Datenbank ausgeführt wird und der Container stoppt - das bedeutet, dass alle Daten verloren gehen?

Bände zur Rettung.
Dies sind benannte Dateisystembäume, die von Docker für uns verwaltet werden.

Beispiel: Persistierende Postgres SQL-Daten:

services:    
  db:
    image: postgres:latest
    volumes:
      - "dbdata:/var/lib/postgresql/data"
    volumes:
     - type: volume #<-----Notice the type
       source: dbdata
       target: /var/lib/postgresql/data
volumes:
  dbdata:

Beachten Sie, dass in diesem Fall bei benannten Volumes die Quelle der Name des Volumes ist (bei anonymen Volumes wird dieses Feld weggelassen).

Teil 2 - Vergleich

Unterschiede in der Verwaltung und Isolation auf dem Host

Bindungs-Mounts sind im Host-Dateisystem vorhanden und werden vom Host-Betreuer verwaltet.
Anwendungen / Prozesse außerhalb von Docker können diese ebenfalls ändern.

Volumes können auch auf dem Host implementiert werden, Docker verwaltet sie jedoch für uns und kann außerhalb von Docker nicht aufgerufen werden.

Volumes sind eine viel umfassendere Lösung

Obwohl beide Lösungen uns helfen, den Datenlebenszyklus von Containern zu trennen, erhalten Sie durch die Verwendung von Volumes viel mehr Leistung und Flexibilität gegenüber Ihrem System.

Mit Volumes können wir unsere Daten effektiv entwerfen und von anderen Teilen des Systems entkoppeln, indem wir sie an bestimmten Remotestandorten (z. B. Cloud) speichern und in externe Dienste wie Backups, Überwachung, Verschlüsselung und Hardwareverwaltung integrieren.


2
Ich danke Ihnen, dass Sie Anwendungsbeispiele gegeben haben, insbesondere mit Docker-Compose-Ymls
Robino

4

Der Unterschied zwischen dem Host-Verzeichnis und einem Datenvolumen besteht darin, dass Docker dieses verwaltet, indem es es in das $DOCKER-DATA-DIR/volumesVerzeichnis legt und einen Verweis darauf anfügt (Namen oder zufällig generierte IDs). Das heißt, Sie bekommen ein bisschen Bequemlichkeit.

Sowohl Hostverzeichnisse als auch Datenvolumes sind Verzeichnisse auf dem Host. Beide sind hostabhängig. Sie können keinen von ihnen in a referenzieren Dockerfile; Die VOLUMEDirektive erstellt jedes Mal, wenn Sie einen neuen Container starten, ein neues namenloses Volume (mit zufällig generierter ID) und kann nicht auf ein vorhandenes Volume verweisen.

* $DOCKER-DATA-DIR ist /var/lib/dockerhier, es sei denn, Sie haben die Standardeinstellungen geändert.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.