Docker Logo

Docker Volumes mit NFS nutzen

Wer kennt es nicht, da hat man stundenlang etwas programmiert oder zusammen gebaut und plötzlich sind die Daten weg. Das ist ärgerlich und muss nicht sein, denn Datensicherung ist gar nicht so schwer. Und wer kennt den Spruch dazu: „Datensicherung ist nur was für Weicheier“.

Wenn es trotzdem passiert ist der Ärger da und man fragt sich, warum hat man sich nicht erst um die Datensicherung gekümmert. Noch schlimmer ist es wenn Daten auf Docker Hosts liegen, ich kenne sehr viele die keine Datensicherungstrategie haben da diese auf virtuelle Maschinen arbeiten und glauben dass ein Snapshot eine Datensicherung ist, ganz großer Irrtum.

Seit vielen Jahren hab ich ein Synology NAS Laufwerk mit zwei gespiegelten Festplatten und einer externe USB-Platte, auf der täglich das NAS-Laufwerk weggesichert wird. Merke gerade das ich doch etwas vom Thema abschweife, dennoch hat das Thema „Docker Volumes mit NFS“ indirekt mit Datensicherung zu tun. Da das NFS-Laufwerk auf die externe USB-Festplatte mitgesichert wird, bietet sich es an Docker Volumes mit NFS zu nutzen. Das Thema ist für Einstieger doch mit ein paar Hürden versehen.

Nehmen wir an das Du als Leser, mit NodeRED arbeitest und programmierst. Dort werden verschiedene Dateien permanent im Hintergrund beschrieben und bei den Nodes werden immer mal neue Paletten ( Zusatzliche Nodes ) hinzugefügt. Da einige NodeRED Flows Abhängigkeiten zu Paletten haben, sonst läuft der Flow nicht, müssen diese immer nachinstalliert werden. Es ist immer wieder ein Aufwand diese nach zu installieren der nicht mehr nötig ist. In unserem Fall in diesem Artikel, läuft NodeRED auf einem Docker Host oder im Docker Swarm.

Hinweis: 

Eine Bitte an alle Raspberry Pi Benutzer. Installiert NodeRED nicht mehr nativ auf den Raspberry Pi oder auch andere Server Programme wie zB. WireGuard, Heimdall, Etherpad, Webserver usw. Die Zeiten wo noch alles lokal installiert wird, sind definitiv vorbei. Raspberry Pi ist für Docker sehr gut einsetzbar und es gibt keinen Grund mehr es nicht zu tun. Der Raspberry Pi 4 mit 4GB Headless mit Raspian Lite ist eine richtige Powermaschine mit Docker. Sichert die Dockerfiles und docker-compose Files in ein lokales GIT, dann benötigt es keine Sicherung mehr von lokalen Daten in Verbindung mit Docker Volume NFS. Glaube mir es geht fast nicht mehr besser, da ich schon über 1 Jahr mit Docker Container arbeite ohne Verlust und ohne Probleme. Solange Docker Anwendungen nicht über das Internet direkt erreichbar sein müssen, gibt es auch kein Problem mit Sicherheit und Hacker. Sollte der Wunsch da sein, Anwendungen über das Internet erreichbar zu machen kann ich diesen Artikel empfehlen : NGINX Proxy Manager für HomeOffice mit Fritzbox

So kommen wir nun zum eigentlichen Thema und Einrichtung.

Was benötigt wird:

Einrichtung NFS-Laufwerk:

Anmeldung auf der Synology NAS-Oberfläche

Dazu nehme man den Pfad /volume1/Docker und erstellen im der File Station ein Unterverzeichnis:

/docker/nodered = /volume1/Docker/docker/nodered als NFS-Share

Jetzt die Docker Installation wie in oben angezeigten Artikel beschrieben durchführen

Nach der fertigen Installation auf dem Raspberry Pi folgenden Befehl ausführen ob der NFS-Export erfolgreich war. Die IP-Adresse ist mit der der IP-Adresse Deiner Synology NAS Station zu ersetzen.
Wenn in der Exportliste die Share-NFS Laufwerke angezeigt werden ist das schon die halbe Miete. Bitte beachte auch noch, dass das Share beschreibbar ist. Testen kann man es mit einem Test Mount:

sudo mount -t nfs 192.168.10.22:/volume1/Docker /mnt
touch /mnt/testfile sollte erfolgreich sein mit dem Benutzer "pi" (kein sudo nutzen)
sudo umount /mnt

Nun sollte alles eingerichtet sein um den ersten NodeRED Docker Container mit NFS-Volume zu erstellen. Erstelle eine Datei „docker-compose.yml“ mit dem Editor Deiner Wahl auf dem Raspberry Pi mit folgendem Inhalt: 

version: "3.5"
services:
  node-red:
    image: nodered/node-red:latest
    environment:
      - TZ=Europe/Amsterdam
    ports:
      - "1880:1880"
    networks:
      - node-red-net
    volumes:
      - nodered-data:/data
volumes:
  nodered-data:
      driver: local
      driver_opts:
        type: "nfs"
        o: "nfsvers=4,addr=192.168.10.4,rw"
        device: ":/volume1/Docker/docker/nodered"
networks:
  node-red-net:

Wenn alles richtig erstellt wurde, kann nun der Docker Container aufgebaut und gestartet werden:

docker-compose -f docker-compose.yml up -d

Es sollte nun der Container NodeRED wie angezeigt gestartet sein und kann im Browser unter folgender URL aufgerufen werden : http://<IP_Adresse_Raspi>:1880

Erstelle nun ein kleiner Beispiel wie oben in NodeRED angezeigt. Der Inhalt ist dabei unwichtig, es geht nur darum das nach dem löschen des Containers der gleiche eigene Inhalt angezeigt wird.

Lösche nun den Container „NodeRED“  um diesen gleich wieder zu erstellen:

Erstelle nun den Container nochmals mit folgenden Befehl:

docker-compose -f docker-compose.yml up -d

Der Container NodeRED  sollte gestartet sein und kann im Browser unter folgender URL aufgerufen werden : http://<IP_Adresse_Raspi>:1880 . Der Inhalt sollte wie vor dem löschen des Containers gleich aussehen.

Dh. der Inhalt der Programmierung in NodeRED liegt nicht mehr lokal uf dem Docker Host dort wo der NoderRED Container läuft, sondern auf dem NFS-Laufwerk. Schau kurz mit der File Station auf der Synology Box nach ob dort Dateien wie angezeigt liegen.

Wenn die Dateien zu sehen sind kann davon ausgegangen werden, dass alles richtig eingerichtet ist und funktioniert. Für mehrere NodeRED Instanzen kann jeweils ein eigenes Unterverzeichnis wie oben angezeigt angelegt werden. Dabei muss nur der Expose Port um eine Ziffer erhöht werden und der Name des Volumes mit einem neuen Namen zum anderen NFS-Pfad angelegt werden.

Hier noch ein Beispiel für Docker Swarm, was entsprechend noch angepasst werden muss für die eigene Umgebung:

################################################################################
# Node-RED Stack or Compose
################################################################################
# docker stack deploy node-red --compose-file docker-compose-node-red.yml
# docker-compose -f docker-compose-node-red.yml -p myNoderedProject up
################################################################################
version: "3.5"
services:
  node-red:
    image: nodered/node-red:1.2.8
    hostname: docker02
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints:
         - node.hostname == docker02
    environment:
      - TZ=Europe/Amsterdam
    ports:
      - "1880:1880"
    networks:
      - node-red-net
    volumes:
      - nodered-data:/data
volumes:
  nodered-data:
      driver: local
      driver_opts:
        type: "nfs"
        o: "nfsvers=4,addr=192.168.10.4,rw"
        device: ":/volume1/Docker/docker/nodered"
networks:
  node-red-net:

Bei Fragen wie immer Kommentarfunktion nutzen.

Viel Erfolg wünscht Joachim beim Docker Container bauen.

Alle Artikel auf dieser Seite sind mit einem sogenannte Provision-Links. Wenn du auf so einen Verweislink klickst und über diesen Link einkaufst, bekomme ich von deinem Einkauf eine Provision. Weiterführende Infos gibt es hier unter Punkt 8 in der Datenschutzerklärung  https://blog.unixweb.de/datenschutzerklaerung/

Joachim

Aus Leidenschaft für Technik. Aktuelle Themen sind Datensicherheit, Software für Datenschutz, Mobile Geräte, Smartphone Sicherheit und Anwendungen, Raspberry Pi Geek.

Alle Beiträge ansehen von Joachim →

12 Gedanken zu “Docker Volumes mit NFS nutzen

  1. Hallo Joachim, seit unserem letzten Schreiben ist wieder einige Zeit vergangen und ich habe bereits eine Docker Variante mit OH3 produktiv (bei Kunden) laufen. Dieser Artikel kommt gerade zur rechten Zeit, da es natürlich wie du schreibst sehr gefährlich ist, wenn die Programme weg sind.

    Eine Frage dazu: Kann ich die Sicherung (Umstellung auf NFS) auch nach bereits laufenden Containern machen?

    Vermute mal ja, muss ja nur das Volume ändern.

    vielen herzlichen Dank für deine sehr hilfreichen Tipps und sauber gemachten Anleitungen!

    Liebe Grüße,
    Karl-Heinz

    1. Hallo Karl-Heinz

      Hänge einfach in das bestehende docker-compose File den ganzen „volumes“ Teil an.
      Für die Migration stoppst den Container nochmal.
      Dann die Daten von /var/lib/docker/volumes/ nach NFS-Pfad kopieren.
      Docker Container neu starten, fertig.

      Vielen Dank für das Lob.

      Viel Erfolg und Grüße , Joachim

  2. Hallo Joachim,

    eigentlich ist das genau das, was ich für ein anderes Projekt benötige. Allerdings scheitere ich an NFS mit den Berechtigungen. Zudem kann es sein, daß meine DSM-Version nicht ganz aktuell ist. Ich habe eine DS411Slim mit der Version DSM 6.2.4-25556. Vermutlich ist bei Deiner Synology eine neuere Version am laufen? Alternative Frage: Bekommst Du den Docker-Container scmmanager/scm-manager mit dem Daten-Verzeichnis auf dem NAS ans laufen?

    Grüße

    Jochen

    1. Hallo Jochen

      Was gibt den das Kommando „showmount -e IPAdresseVonSynology“ aus?
      Ich verstehe noch nicht wo an welcher Stelle es nicht funktioniert.

      Beste Grüße Joachim

  3. Hi Joachim,

    ich verwende auf einem Debian 10 System folgendes docker-compose.yml:

    version: „3.5“
    services:
    scmmgr:
    image: scmmanager/scm-manager:latest
    environment:
    – TZ=Europe/Berlin
    ports:
    – „2222:2222“
    – „8080:8080“
    networks:
    – netscmmgr
    volumes:
    – scmmanager-data:/var/lib/scm
    volumes:
    scmmanager-data:
    driver: local
    driver_opts:
    type: „nfs“
    o: „nfsvers=4,addr=192.168.71.10,rw“
    device: „:/volume1/docker/scmmanager“
    networks:
    netscmmgr:

    Die IP 192.168.71.10 ist dabei die von meinem NAS. Wenn ich versuche, das mit docker-compose zu starten, kommt folgende Fehlermeldung:

    Creating scmmanager_scmmgr_1 … error

    ERROR: for scmmanager_scmmgr_1 Cannot create container for service scmmgr: failed to copy file info for /var/lib/docker/volumes/scmmanager_scmmanager-data/_data: failed to chown /var/lib/docker/volumes/scmmanager_scmmanager-data/_data: lchown /var/lib/docker/volumes/scmmanager_scmmanager-data/_data: invalid argument

    ERROR: for scmmgr Cannot create container for service scmmgr: failed to copy file info for /var/lib/docker/volumes/scmmanager_scmmanager-data/_data: failed to chown /var/lib/docker/volumes/scmmanager_scmmanager-data/_data: lchown /var/lib/docker/volumes/scmmanager_scmmanager-data/_data: invalid argument
    ERROR: Encountered errors while bringing up the project.

    Das Kommando showmount -e 192.168.71.10 zeigt folgendes an:
    Export list for 192.168.71.10:
    /volume1/docker 192.168.71.0/24

    Dabei ist der NFS Share auf dem NAS mit Root Squash „Alle Benutzer zu Admin zuordnen“ angelegt.

    Der Ordner scmmanager existiert auf dem NFS Share, und die Gruppe Admin hat alle Rechte darauf.

    Jetzt ist guter Rat teuer.

    1. Hallo Jochen

      mach doch mal folgenden Befehl:

      sudo mount -t nfs 192.168.71.10:/volume1/docker /mnt

      Was kommt da raus ?

      Du musst an den Rechten von dem Filesystem ziemlich viel anpassen.
      Schau mal ob Du es hinbekommst als Gast schreiben zu dürfen, hatte da
      einiges an Rechten für das Filesystem angepasst was ich leider nicht alles hier zeigen kann.

      Eventuell hilft Dir dieser Artikel hierzu weiter:
      https://www.synology.com/de-de/knowledgebase/DSM/help/DSM/AdminCenter/file_share_privilege_nfs

      Viel Erfolg und Grüße , Joachim

      1. Hallo Joachim,

        habe ähnliche Probleme. Wenn ich mit dem Mount-Befehl auf dem Pi selber mounte klappt es, ein touch ohne sudo kann ich aber leider nicht ausführen und brauche sudo.
        Da ich was Berechtigungen auf dem Filesystem in Linux ziemlicher Neuling bin, wäre meine Frage, wo ich da anpacken muss.
        Kannst du mir da helfen?

          1. Hallo Joachim,

            danke für deine Antwort.

            Der Befehl zeigt den richtigen Pfad, unter dem ich die Ordner und Dateien ablegen will, und dahinter meinen Pi.

            Zur Sicherheit: der Pfad ist /volume2/IoT und die Volumes sollen dann in Unterordner (z.B. /volume2/IoT/Influx oder /volume2/IoT/grafana) gemutet werden.

            Die Frage ist, wie muss ich die Rechte entsprechend anpassen, dass ich vom Pi aus auf die Diskstation schreiben kann, ohne dass ich das gleich für jeden im Netzwerk erlauben muss?

            Danke dir schon im Voraus.

  4. Hallo Joachim,

    Wäre es auch möglich eine NFSv4 Freigabe innerhalb eines Docker Volumes zu mounten?
    In meinem Fall möchte ich aus dem Nextcloud Docker Volumes nur die Daten von
    /var www/nextcloud/data/user
    Auf meinem NFS Server haben.

    Gruß Marcel

    1. Hallo Marcel

      dass macht keinen Sinn. Was spricht dagegen das Datenverzeichnis genau so zu mounten wie beschrieben?
      Dann werden die Daten auf NFS gesichert. Sei Dir aber bewusst dass Du dabei enorme Performance Verluste
      bei der Anwendung Nextcloud haben wirst.

      Grüße Joachim

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert