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 dbdata
Container gemountet .
Wir haben dann ein lokales Hostverzeichnis als bereitgestellt /backup
.
Schließlich haben wir einen Befehl übergeben, mit tar
dem der Inhalt des dbdata
Volumes in einer backup.tar
Datei in unserem /backup
Verzeichnis gesichert wird . Wenn der Befehl abgeschlossen ist und der Container stoppt, wird eine Sicherungskopie unseres dbdata
Volumes erstellt.
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
Volumenvorteile gegenüber Bindungshalterungen:
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
Binden Sie die Halterungen
Es gibt auch
tmpfs mounts
.tmpfs wird montiert
Referenz:
https://docs.docker.com/storage/
quelle
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:
(*) 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:
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.
quelle
Der Unterschied zwischen dem Host-Verzeichnis und einem Datenvolumen besteht darin, dass Docker dieses verwaltet, indem es es in das
$DOCKER-DATA-DIR/volumes
Verzeichnis 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
; DieVOLUME
Direktive 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/docker
hier, es sei denn, Sie haben die Standardeinstellungen geändert.quelle