Docker Volume auf NFS Share

Magier

New member
Hallo

Ich habe zwei Raspi's, einen als Docker System und einen als NAS. Jetzt würde ich gerne ein Volume auf meinem NAS anlegen. Nach etwas Suche bin ich auf NFS als Freigabe gestoßen. Jetzt frage ich mich wie da der beste Weg ist.

A) den Ordner für das Volume per fstab, also über das System mounten [https://www.linux-praxis.de/nfs-nfs-fstab-format-und-optionen]
B) habe herausgefunden das man Volumes auch in direkt als NFS-Mount anlegen kann [https://blog.stefandroid.com/2021/03/03/mount-nfs-share-in-docker-compose.html]

Ich weiß, es gibt immer dutzende Weg die nach Rom führen aber gibt es bei den beiden Wegen irgendeinen Unterschied der mir (noch) nicht bewusst ist?
Die NFS Freigabe funzt soweit. Kann sie problemlos vom Docker-Raspi mounten und beschreiben.
(Und ja ich weiß das ich für mein Setup erst das NAS Starten muss, damit mein Docker Container richtig funzt.)

Infos zu den Systemen
Docker:
  • Raspberry Pi 4 (8GB)
  • Linux Docker 6.1.0-rpi7-rpi-v8 #1 SMP PREEMPT Debian 1:6.1.63-1+rpt1 (2023-11-24) aarch64
  • DockerServer:
    Engine:
    Version: 20.10.24+dfsg1
    API version: 1.41 (minimum version 1.12)
    Go version: go1.19.8
    Git commit: 5d6db84
    Built: Thu May 18 08:41:26 2023
    OS/Arch: linux/arm64
    Experimental: false
    containerd:
    Version: 1.6.20~ds1
    GitCommit: 1.6.20~ds1-1+b1
    runc:
    Version: 1.1.5+ds1
    GitCommit: 1.1.5+ds1-1+b1
    docker-init:
    Version: 0.19.0
NAS:
  • Raspberry Pi 4 (4GB)
  • Linux NAS 6.1.0-rpi7-rpi-v8 #1 SMP PREEMPT Debian 1:6.1.63-1+rpt1 (2023-11-24) aarch64
  • openmediavault information
  • Release: 7.0-25Codename: Sandworm
  • aktive NFS-Versionen: NFSv3, NFSv4, NFSv4.1, NFSv4.2
  • 2X 1TB-SSDs per USB (als Datenlager->Ziel)
Schon mal DANKE fürs darüber Nachdenken und Grüße
Magier
 
Zuletzt bearbeitet:
aber gibt es bei den beiden Wegen irgendeinen Unterschied der mir (noch) nicht bewusst ist?
Naja, der Unterschied ist (in meinen Augen) doch recht offensichtlich: Während bei der ersten Variante (fstab) ein Ordner gemountet wird und (vermutlich) "generell" (z.B. als Default-Ort für neue Volumes) genutzt werden kann, hat man bei der zweiten Variante die nötigen Dinge halt in der docker-compose.yaml stehen. Abseits davon wird der NFS-Export in der fstab normalerweise auch direkt beim Bootvorgang des OS gemountet, bei der docker-compose.yml natürlich erst, wenn die Container gestartet werden.

Also ich persönlich würde vermutlich generell zur ersten Variante tendieren und in Ausnahmefällen dann ggf. noch zusätzlich die zweite Variante hinzuziehen (je nach Sonderlocken halt).

Bin jetzt aber auch nicht so der Docker-Typ, da gibt es hier Leute mit wesentlich mehr Ahnung 😅
 
Bei Containers solltest Du den Weg über Volumes bevorzugen. NFSv4 (4.1 und 4.2 natürlich auch) funktioniert im Vergleich zu NFSv3 stabiler und hat weniger Probleme als CIFS.

Ein Volume wird erst gemountet, sobald ein oder mehr Container ihn nutzen, und unmountet sobald kein Container mehr läuft, der ihn nutz.

Ein solches Volume besteht nur aus der Definition, die weiß was gemountet werden soll und dies dann im Bedarfsfall automatisch tut. Wenn man das Volume löscht, ist nur die Definition weg, aber natürlich nichts auf dem Remote-Share.

Tipp: ro/rw würde ich nicht am Volume, sondern auf Eben der Volume-Deklaration auf Service-Ebene definieren.

Beim Zweiten Blick fällt mir noch was auf:
- die Docker Version ist relativ alt. Wir sind jetzt bei Version 24.x. Version 25.x ist kurz vor final
- die Docker Installation stammt von Debian Paketen und nicht Paketen aus den Docker Repos. Nur letztere haben garantiertes vanilla Verhalten, dass auch zu ihrer Dokumentation passt. Andere Maintainer passen ihre Pakete gerne hier und da an, damit sie zur Philosophie ihrer Distribution passen.
 
Zuletzt bearbeitet:
Hallo und Danke
- die Docker Version ist relativ alt. Wir sind jetzt bei Version 24.x. Version 25.x ist kurz vor final
- die Docker Installation stammt von Debian Paketen und nicht Paketen aus den Docker Repos....
Ja stimmt, habe das einfach aus dem Standard-Repo gezogen. Habe mir die neuste aus
Code:
/download.docker.com/linux/debian bookworm InRelease
gezogen und habe jetzt 25.0.0 drauf.
Code:
Client: Docker Engine - Community
 Version:           25.0.0
 API version:       1.44
 Go version:        go1.21.6
 Git commit:        e758fe5
 Built:             Thu Jan 18 17:10:12 2024
 OS/Arch:           linux/arm64
 Context:           default

Server: Docker Engine - Community
 Engine:
  Version:          25.0.0
  API version:      1.44 (minimum version 1.24)
  Go version:       go1.21.6
  Git commit:       615dfdf
  Built:            Thu Jan 18 17:10:12 2024
  OS/Arch:          linux/arm64
  Experimental:     false
 containerd:
  Version:          1.6.27
  GitCommit:        a1496014c916f9e62104b33d1bb5bd03b0858e59
 runc:
  Version:          1.1.11
  GitCommit:        v1.1.11-0-g4bccb38
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
Danke für den Hinweis. Vergesse immer das das "Out-Of-The-Box" Repo von Raspberry Pi OS/Debain nicht immer so aktuell ist.

Für den Rest -> werde mich an eure Tipps halten und das NFS-Mounting über den Compose erledigen. Mal sehen wie das läuft.:coffee:
 
Zuletzt bearbeitet:
Oh, 25 ist schon final? Ich hab auch gleich mal aktualisiert. Danke dafür!

Magst Du aus "Composer", noch "Compose" machen. Ersteres ist ein Paketmanager für PHP, zweiteres der Multi-Container Single-Node Orchestrator.
 
@Confluencer :)
Erledigt, denglisch und wenig Hirn dazu geschaltet....

Hat übrigens geklappt 🎉👍. Influx läuft....
Noch ein Tipp:
Wenn Docker mault, es sein was schief gelaufen mit chmod in Volume, einfach auf das Ziel gehen und im entsprechenden Ordner eine leere Datei erzeugen, schon gehts.
 
Wenn der Container beim Start nicht selbst die Berechtigungen glatt zieht, dann muss man selbst darauf achten, dass der Besitzer des Pfads im gemappten Remote-Share dieselbe UID:GID hat, wie die UID:GID des Prozesses im Container. Wäre bei einem Bind eines Host-Verzeichnisses in ein Container-Verzeichnis auch nicht anders, nur das es hier eben ein Verzeichnis auf einem Remote-Share ist.
 
Ja habe ich auch gelesen, scheint bei mir aber nicht das Problem gewesen zu sein.
Habe gleich die meisten Volumes so angelegt/verschoben
-InfluxDB
-Node-Red
-Mosquitto (Mqtt)
-Grafana

Hauptgrund war das in die InfluxDB alle Daten von Mosquitto landen und ich nicht wollte das die SD-Karte vom Docker-System vollläuft. So ist es aber auch einfacher für mich die Volumes zu Backupen.

So nebenbei, habe erst einen ziemlichen Schreck/Nerv bekommen, da die Dateien von den NFS Mounts/Volumes auch im Docker System zu sehen war [/val/lib/docker/volumes]. Habe dann mal ein Volume erzeugt, in ein Ubuntu gebunden und darin eine große Datei erzeugt ~2GB.
:df zeigte auf dem Docker System aber keinen Zuwachs. Auf dem NAS schon.

Liege ich damit richtig, das die NSF Volumes auf dem Docker System keinen Platz verbrauchen. (Fühle mich aber immer noch verwirrt..weil wenn ich den Container Stop (Moquitto z.B.) sind die Verzeichnisse+Dateien immer noch auf dem Docker System zu sehen.)

Musste wegen Zeitmangels an diesem Punkt aber meine Untersuchung und Suche im Netz unterbrechen (erst mal laufen die NFS Shares ja bis die InfluxDB meine SD Karte sprengen kann dauert es noch etwas :) )

Aber hat dazu jemand einen guten Ansatzpunkt/Erklärung/Link?? Denke das das irgendwo steht, mir aber das richtige Vokabular fehlt oder ich den Wald vor lauter Bäumen nicht sehe.

MfG
 
So ganz unerheblich ist die Entscheidung die Volumes über NFS von der SD-Karte wegzuleiten auch nicht: es verlängert die Lebensdauer der SD-Karte, da weniger Schreiboperationen auf der Karte stattfinden. Nichts ist nerviger, als wenn einem die SD-Karte krepiert...

Vorsicht beim Thema Backup: man bekommt nicht bei jedem Container ein konsistentes Backup, wenn man die Dateien bei laufendem Container Backuped.

Natürlich sind Named Volume (=durch Docker gamanagtes Zugriff auf Speicher) im System zu sehen. Bei Volumes vom Type NFS liegt unter /var/lib/docker/volumes/{volume name}/opt.json die Information zum mounten des Remote Shares. Diese Datei ist wenige hundert Bytes groß und das EINIGE was von diesem Volume Platz auf dem Docker Host belegt.

Erst sobald ein Container dieses Volume verwendet, wird der RemoteShare durch Docker nach /var/lib/docker/volumes/{volumename}/_data gemountet, und dann beim Container-Start als Bind in den jeweiligen Container-Pfad gehangen.

Fühle mich aber immer noch verwirrt..weil wenn ich den Container Stop (Moquitto z.B.) sind die Verzeichnisse+Dateien immer noch auf dem Docker System zu sehen.)
Bitte um nähe Erklärung: ist damit das Containerdateisystem gemeint oder etwas anderes?

Aber hat dazu jemand einen guten Ansatzpunkt/Erklärung/Link??
Zu was genau?
 
Zuletzt bearbeitet:

Zurzeit aktive Besucher

Keine Mitglieder online.

Letzte Anleitungen

Statistik des Forums

Themen
4.534
Beiträge
46.475
Mitglieder
4.171
Neuestes Mitglied
bendermaier
Zurück
Oben