Wie entscheide ich mich zwischen einem Docker-Volume-Container und einem Docker-Volume?

24

Nachdem ich die Dokumente gelesen hatte, war ich etwas verwirrt darüber, wie produktive Anwendungs- / Servicedaten am besten verwaltet werden können.

Es scheint 3 Möglichkeiten zu geben:

  1. Ordnen Sie das Volume einfach dem Host-Verzeichnis zu (dh dem -vArgument für docker run).
  2. Erstellen Sie ein Docker-Container-Image für Daten (dh separate Container und --volumes-from)
  3. Docker-Volume erstellen (z. B. docker volume create)

Nun scheint es, dass die akzeptierte Praxis Option # 2 ist, aber dann frage ich mich, was der Zweck von # 3 ist.

Insbesondere wie gehen Sie mit diesen Szenarien richtig um docker volumeund ist es besser, einen Datenvolumencontainer zu verwenden oder dies für jede Situation?

  • Sie benötigen Anwendungsdaten in einem separaten Volume und / oder einer separaten Speicherebene auf Ihrem Server
  • Sichern
  • Daten wiederherstellen
dukeofgaming
quelle
@MichaelHampton Ich erkannte, dass ich meine Frage
umformulieren
# 1 ist keine ernsthafte Option für die Produktion; Es sollte grundsätzlich nie gemacht werden, wenn eine Alternative existiert.
Michael Hampton
2
@MichaelHampton Warum? Die Daten werden möglicherweise nicht angedockt, aber das Host-Betriebssystem wird weiterhin von einem Infrastruktur-Team verwaltet, das sie überwacht und
sichert
@dukeofgaming Ganz zu schweigen davon, dass Sie darauf ausführen btrfs scrubkönnen, um beschädigte Dateien zu finden und zu korrigieren. Ich bin mir nicht sicher, wie dockerisiertes Material funktioniert, aber ich vermute, es schützt nicht vor Datenfäule. Ich benötige daher immer eine vollständige Wiederherstellung, wenn etwas Schlimmes passiert, anstatt nur einzelne Dateien wiederherzustellen. Ein anderer Gedanke ist, dass es eine weitere Abstraktionsebene hinzufügt, wodurch das Lesen und Schreiben von Dateien noch mehr verlangsamt wird. Ich sehe die Vorteile von # 2 und # 3 irgendwie nicht, aber ich habe keine Erfahrung mit Docker, daher könnte sich dies ändern.
Inf3rno

Antworten:

18

Ich denke, # 2 und # 3 sind so ziemlich dasselbe, der Hauptunterschied ist, dass es keinen gestoppten Container mit # 3 gibt (es ist buchstäblich nur ein benanntes Volume). Sie können beispielsweise ein benanntes Volume erstellen und -vstattdessen auf ähnliche Weise wie mit # 2 vorgehen.

Erstellen Sie ein benanntes Volume:

$ docker volume create --name test

Hängen Sie einige Daten aus einem Container in dieses Volume ein und schreiben Sie sie:

$ docker run -v test:/opt/test alpine touch /opt/test/hello

Sie können dann dasselbe testVolume in einem anderen Container bereitstellen und die Daten lesen:

$ docker run -v test:/opt/test alpine ls -al /opt/test     
total 8
drwxr-xr-x    2 root     root          4096 Jan 23 22:28 .
drwxr-xr-x    3 root     root          4096 Jan 23 22:29 ..
-rw-r--r--    1 root     root             0 Jan 23 22:28 hello

Der Vorteil hierbei ist, dass das Volume nicht versehentlich verschwindet, wenn Sie den Nur-Daten-Container entfernen. Sie verwalten es jetzt mit dem docker volumeUnterbefehl.

$ d volume ls
DRIVER              VOLUME NAME
local               test

Es eröffnet auch die Möglichkeit für Volume-Treiber, sodass Sie möglicherweise freigegebene Volumes zwischen Hosts (dh benannte Volumes über NFS) ausführen können. Beispiele hierfür sind Flocker und Convoy . Convoy verfügt über spezifische Unterbefehle zum Sichern von Daten und ermöglicht die Speicherung auf NFS oder EBS außerhalb Ihres Hosts.

Aus diesem Grund denke ich, dass die neuere Methode (Docker 1.9+) darin besteht, ein benanntes Volume anstelle eines reinen Datencontainers zu verwenden.

Andy Shinn
quelle
Vielen Dank, Sie haben die meisten meiner Fragen beantwortet, aber der Punkt zum Verwalten von Containerdaten in einer anderen physischen Datenträgerschicht ist immer noch unbeantwortet. Dies ist der kritische Punkt Daten (bei denen es sich um ein in einer Docking-Datei definiertes Volume handelt) im Tier 0-Speicher auf einem anderen physischen Host-Volume (dh einer anderen Partition, einem physischen Datenträger oder was auch immer)
dukeofgaming
Ich tat es irgendwie mit der Erwähnung von Lautstärketreibern. Um Daten außerhalb des physischen lokalen Speichertreibers zu speichern, müssten Sie derzeit Daten verwenden, die genau das tun, was Sie möchten. Aus dem Kopf gibt es github.com/rancher/convoy und github.com/ClusterHQ/flocker . Convoy unterstützt derzeit NFS und GlusterFS, was näher an Ihrem Wunsch liegt. Ich werde die Antwort ändern, um dies zu klären.
Andy Shinn
Die Verwendung des Devicemapper-Treibers scheint meine Frage zu beantworten, danke! docs.docker.com/engine/userguide/storagedriver/…
dukeofgaming
the volume won't accidentally disappear if you remove the data-only container. Könnten Sie näher darauf eingehen? Vielen Dank.
Stephane
22

Ab Docker 1.9 wird das Erstellen von benannten Volumes mit der Volumes-API ( docker volume create --name mydata) einem Datenvolumen-Container vorgezogen. Ab Februar 2016 ist die Dokumentation der Docker- Bände leider nicht mehr aktuell. Die Leute bei Docker selbst schlagen vor, dass Datenträger- Container " nicht mehr als empfohlenes Muster angesehen werden", " benannte Datenträger in den meisten Fällen (wenn nicht in allen Fällen) reine Datenträger ersetzen können " und " kein Grund, den ich zu verwenden sehe" Nur-Daten-Container . “

Quinn Comendant
quelle