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:
- Raspberry Pi 3+ ( https://amzn.to/3uECf47 ) *
- Installiertes Docker auf dem Raspberry Pi ( Docker auf Raspberry Pi )
- Docker-Compose und Files ( Docker-Volumes-NFS )
- Synology NAS Laufwerk oder ähnliches ( https://amzn.to/37VA6ao ) *
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/
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
Hallo Karl-Heinz
Hänge einfach in das bestehende docker-compose File den ganzen „volumes“ Teil an. nach NFS-Pfad kopieren.
Für die Migration stoppst den Container nochmal.
Dann die Daten von /var/lib/docker/volumes/
Docker Container neu starten, fertig.
Vielen Dank für das Lob.
Viel Erfolg und Grüße , Joachim
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
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
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.
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
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?
Hallo Marco
Das Kommando:
showmount -e IP-Adresse-NAS
zeigt was an ?
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.
Hallo Marco
das weiß ich nicht, ich hab es als Gast gemountet und dann die Schreibrechte dafür angepasst. Es ist ja nur für das eine NFS Share, eventuell hilft Dir dieser Artikel weiter:
https://kb.synology.com/de-de/DSM/help/DSM/AdminCenter/file_share_privilege_nfs?version=7
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
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