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ünsch Joachim beim Docker Container bauen.

Die mit Sternchen (*) gekennzeichneten Verweise sind 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/

2 Kommentare

  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

Kommentar hinterlassen

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