Docker Daten speichern: Docker Volumes vs. Host-Ordner

 

Ich betreibe eine handvoll Docker Container auf einem einzelnen Linux-Host. Docker-Container werden bei einem erneuten erstellen oder beim Austausch auf eine neuere Imageversion bekanntlich ausgetauscht und verlieren dabei alle geänderten Daten. Um bestimmte Ordner eines Containers permanent zu speichern, müssen diese über Volumes oder Bind-Mounts ausgelagert werden. Ich habe dazu meist bestimmte Pfade der Container in definierten Ordnern am Host verbunden (Bind-Mounts). Mit ein Grund für die Verwendung von Bind Mounts anstelle von Volumes ist, dass ich die Ordner über den Host einfacher kopieren, sichern oder auf einen anderen Host übertragen kann. Aber ist das überhaupt der richtige Ansatz? Sollte ich besser Docker-Volumes einsetzen? Was ist der Vorteil von Docker Volumes?

Bind-Mounts

Wie bereits erwähnt sind Bind-Mounts definierte Ordner des Host-Rechners die in bestimmte Verzeichnisse des Docker-Containers verbunden werden. Der Host-Ordner fügt sich im Dateisystem des Docker Containers nahtlos ein und verhält sich im Filesystem des Containers wie jeder andere Ordner. Am Host-Ordner können die Daten gelesen und geändert werden. 

Docker Volumes 

Volumes sind die empfohlene Variante um Daten von Docker-Containern zu speichern. Volumes sind Ordner die vollständig von Docker verwaltet werden, was den Speicher vom darunterliegenden Host unabhängig und sicherer macht. Die Verwaltung von Docker-Volumes kann über Docker-CLI-Befehle oder der Docker-API erfolgen. 

Docker Volumes vs. Bind-Mounts

Vorteile von Volumes

  • Volumes werden von Docker verwaltet und sind damit, genau wie die Container: betriebssystemunabhängig.
  • Volumes können mit Docker-CLI-Befehlen oder der Docker-API verwaltet werden.
  • Beim Einsatz von Docker Desktop auf Windows oder MAC liefern Volumes eine bessere Performance
  • Der mögliche Einsatz von Volume-Treibern und die damit verbundenen Optionen Volumes auf entfernten Hosts oder Cloud-Anbietern zu speichern und den Inhalt zu verschlüsseln oder andere Funktionen hinzuzufügen.
  • Der Inhalt von Docker Volumes kann vorbefüllt werden
  • Laut der offiziellen Docker Dokumentation sind Volumes einfacher zu sichern oder zu migrieren als Bind-Mounts: 
    Volumes are easier to back up or migrate than bind mounts.
    Quelle: https://docs.docker.com/storage/volumes/ (Abrufdatum: 06.09.2022)
    Diese Aussage trifft meiner Meinung nach nicht auf jedes Setup zu. Beim Einsatz von Volumes sollte der Zugriff nicht mehr direkt über den Host erfolgen, was den Einsatz von Host-Befehlen, wie rsync oder ein anderes am Host installiertes Backup erschwert. 

Nachteile

Docker Volumes verwenden

Beim Start eines Containers mit "docker run" können Volumes mit dem Parameter -v oder -mount angegeben werden:

docker run -v volumename:/app nginx:latest

Beim Einsatz von --mount als Parameter werden die Eigenschaften etwas ausführlicher angegeben:

docker run --mount source=volumename,target=/app nginx:latest

Mit Docker Compose können Volumes im Bereich volumes definiert und in den Services wie folgt angegeben werden:

File: docker-compose.yml

version: '3.1'

services:
  service1:
    image: test
    ...
    volumes:
      - volumename4service1:/var/www/html

  service1:
    image: test2
    ...
    volumes:
      - volumename4service2:/var/www/html

volumes:
  volumename4service1:
  volumename4service2:
...

Zum Vergleich: Bind-Mounts verwenden

Um anstelle von Volumes Bind-Mounts zu verwenden, wird statt des Volume-Namens einfach ein Pfad im lokalen Dateisystem verwendet. Als Pfad kann ein absoluter oder ein relativer Pfad verwendet werden. Absolute Pfade beginnen mit "/" und sind unabhängig vom aktuellen Ordner in dem sich die docker-compose-Datei befindet. Relative Pfade können mit ./Ordnername als Unterordner relativ zur docker-compose.yml-Datei verwendet werden:

File: docker-compose.yml

version: '3.1'

services:
  service1:
    image: test
    ...
    volumes:
      - /var/absolutefolderpath:/var/www/html

  service1:
    image: test2
    ...
    volumes:
      - ./relativefolderpath:/var/www/html

...

Volumes eines Containers anzeigen: docker inspect

Um herauszufinden, welche Volumes oder Mounts ein Container verwendet, kann der Befehl "docker inspect containername" verwendet werden:

docker inspect wordpress

FAQ

Wo befinden sich Docker-Volumes? 

Volumes werden in einem Ordner im Host-Dateisystem gespeichert und von Docker verwaltet (für Linux: /var/lib/docker/volumes/).

Was ist der Unterschied zwischen Docker Volumes und Bind-Mounts

Beide: Docker Volumes und Bind-Mounts verknüpfen bestimmte Ordner eines Containers mit einem Ordner am Host-Betriebssystem. Bind-Mounts sind dabei definierte Ordner am Host-Betriebssystem, für Docker Volumes wird der Pfad hingegen von Docker verwaltet. Auch Docker-Volumes befinden sich in einem Ordner am Host-Betriebssystem, der Unterschied besteht aber darin, dass Docker den Ordner vorgibt und verwaltet und den Einsatz von Docker-CLI-Befehlen oder der Docker-API ermöglicht.

positive Bewertung({{pro_count}})
Beitrag bewerten:
{{percentage}} % positiv
negative Bewertung({{con_count}})

DANKE für deine Bewertung!

Fragen / Kommentare


Durch die weitere Nutzung der Seite stimmst du der Verwendung von Cookies zu Mehr Details