Zuletzt aktualisiert am 7. Januar 2021.
Oder: Wie das Synology-NAS zum Anwendungsserver wird.
Synology NAS sind mit dem DSM (Disk Station Manager) ausgestattet. Das Betriebssystem der NAS basiert auf Linux und bietet mit Docker und einer Virtualisierungslösung mittlerweile weit mehr als nur eine einfache Speicherlösung.
Gepaart mit potenter Hardware wird aus dem NAS so ein kleiner Anwendungsserver.
Container müssen aktuell gehalten werden
Gerade die integrierte Docker-Lösung bietet nahezu unbegrenzte Möglichkeiten Software und Dienste auf dem Synology NAS laufen zu lassen. So laufen auf meinerDS3018xs mittlerweile neben Plesk, weitere virtualisierte DSM, mehrere Storj-Storagenodes, eine Dokumentenverwaltung, ein TVHEadend-Server, u.v.m.
Container können bequem über die DSM-Oberfläche heruntergeladen und installiert bzw. gestartet werden. Dann läuft der Container.
Was nun leider oft vergessen wird ist, dass sich die Container nicht von alleine Updaten.
Du musst also dafür sorgen, dass du deine Docker-Container regelmäßig updatest. Und dazu reicht es nicht, den Container einfach neu zu starten, das heruntergeladene Image muss mit einem neuen Image ersetzt werden.
Wieso sollte das problemlos klappen?
Da docker Container eigentlich NUR den jeweiligen Dienst zur Verfügung stellen und in einem Container keinerlei Konfigurations- oder Nutzdaten enthalten sind, sollte der jeweilige Dienst nach der Aktualisierung problemlos starten und funktionieren – mit der bisherigen Konfiguration und ohne Änderungen an z.B. in den Container gemounteten Verzeichnissen.
Manuelles Updaten der Docker-Container über den DSM
Leider bietet der Synology Diskstation Manager (DSM) keine möglichkeit Container automatisch und regelmäßig upzudaten, wenn das Image aktualisiert worden ist.
Updates lassen sich jedoch wie folgt manuell über die DSM-Oberfläche durchführen:
- Die Docker-Anwendung aufrufen
- Auf “Registrierung” klicken und das neue Image herunterladen/registrieren
- Den laufenden Container stoppen
- Rechtsklick auf den jeweiligen Container, Aktion und dann “Inhalt löschen” auswählen
- Jetzt den Container wieder neu starten. Er wird nun aus dem neu heruntergeladenen Image gebaut.
Wichtig: Bei dieser Art des Updates bleiben alle Einstellungen und Daten in im Container gemounteten Verzeichnissen natürlich erhalten. Du hast nach dem Update einen Container mit allen Daten wie vorher, nur mit dem aktualisierten Dienst.
Automatisches Updaten der Docker-Container
Die manuellen Updates funktionieren und sind für 1-2 Container, die alle paar Wochen mal ein Update benötigen kein Problem. Wer wie ich jedoch etliche Container am laufen hat, der wird sich schnell über den manuellen Aufwand ärgern 😉
Also lassen wir doch die Container automatisch updaten!
Dafür nutzen wir ein weiteres Docker-Image namens “watchtower”. Dieses gibt es in verschiedenen Varianten (für meine Storj-Container nutze ich z.B. das von Storj bereitgestellte Watchtower-Image).
Für “alle” Container nutzen wir jedoch das am weitesten verbreitete watchtower-Image:
https://registry.hub.docker.com/r/containrrr/watchtower
Hier gibt es zwei Varianten der Ausführung:
- Einen manuelle Ausführung des Watchtower-Images
- Eine kontinuierliche Ausführung des Watchtower-Images
Variante 1: Manuelles Ausführen des Watchtower-Images
Bei jedem Containerstart des Watchtower-Containers werden alle Docker-Container aktualisiert.
Wir starten bei dieser Variante einmal einen Container mit dem Image und dieser aktualisiert alle vorhandenen Container. Die nächste Aktualisierung findet erst statt, wenn wir den Container erneut starten.
Wir gehen auf die Console und erstellen mit folgendem Befehl den Watchtower-Container und starten ihn:
docker run -d --name watchtowerjob -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower:latest --cleanup --include-stopped --run-once
Der Befehl setzt sich wie folgt zusammen:
Parameter | Bedeutung |
docker run | Docker-Run-Command zum Starten eines Docker-Containers |
-d | Der Container soll detached (also im Hintergrund) laufen |
–name watchtowerjob | Der Name des Watchtowercontainers (beliebig) |
-v /var/run/docker.sock:/var/run/docker.sock | Da docker Container eigentlich abgeschottet sind, müssen wir den docker-socket in den watchtower-container mounten. Sonst hat der Watchtower-Container keinen Zugriff auf die zu überwachenden Cnotainer. |
containrrr/watchtower:latest | Das image (mit dem latest-Tag) aus dem der Watchtower-Container gebaut wird |
–cleanup | Alte Images werden gelöscht, nachdem der Container geupdatet worden ist. Ist dieser Parameter nicht gesetzt, bleiben alte Images erhalten und “müllen” so nach und nach das System zu. |
–include-stopped | Auch aktuell gestoppte Container sollen in das Update einbezogen werden. |
–run-once | Sorgt dafür, dass der Container nur einmal ausgeführt wird. |
Der Container ist nun erstellt und läuft einmal durch und kann für jeden weiteren Updateprozess in Zukunft einfach gestartet werden:
docker start watchtowerjob -a
Variante 2: Container kontinuierlich laufen lassen
Diese Variante ist die komplett automatisierte Lösung. Wir starten den watchtower-Container einmal und er läuft im Hintergrund und überprüft in regelmäßigen Abständen, ob es neue Images für die laufenden Container gibt. Wenn ja, wird ein Update angestoßen.
Der Container wird wie folgt gestartet und läuft dann kontinuierlich. Wenn euer NAS neugestartet wird (oder es einen Stromausfall gab), wird auch der Watchtower-Container neu gestartet:
docker run -d --restart unless-stopped --name watchtowercontinuously -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --cleanup --include-stopped --schedule "0 0 4 ? * MON"
Parameter | Bedeutung |
docker run | Docker-Run-Command zum Starten eines Docker-Containers |
-d | Der Container soll detached (also im Hintergrund) laufen |
–restart unless-stopped | Der Container soll immer wieder neu gestartet werden, bis er manuell gestopt wird. |
–name watchtowercontinuously | Der Name des Watchtowercontainers (beliebig) |
-v /var/run/docker.sock:/var/run/docker.sock | Da docker Container eigentlich abgeschottet sind, müssen wir den docker-socket in den watchtower-container mounten. Sonst hat der Watchtower-Container keinen Zugriff auf die zu überwachenden Cnotainer. |
containrrr/watchtower | Das image (mit dem latest-Tag) aus dem der Watchtower-Container gebaut wird |
–cleanup | Alte Images werden gelöscht, nachdem der Container geupdatet worden ist. Ist dieser Parameter nicht gesetzt, bleiben alte Images erhalten und “müllen” so nach und nach das System zu. |
–include-stopped | Auch aktuell gestoppte Container sollen in das Update einbezogen werden. |
–schedule “0 0 4 ? * MON” | Der Watchtower-Container soll immer Montags um 4Uhr nach Updates schauen. |
Tipp: Nur ausgewählte Container updaten – so gehts
Manchmal kann es sinnvoll sein, dass man Container von automatischen Updates ausschließt. Ich betreibe auf meinem NAS z.B: einige Storj-Storagenodes und diese sind sehr empfindlich gegen abruptes herunterfahren. Daher möchte ich diese Container von den automatischen Updates ausschließen.
Dafür einfach am Ende des Kommandos explizit die Namen der Container anhängen, die beobachtet und geupdatet werden sollen.
Wenn man z.B. nur die container ecodms
und container2
automatisch updaten möchte, kann das Startkommando wie folgt aussehen:
docker run -d --name watchtower -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower:latest --cleanup --include-stopped ecodms container2
Weitere Argumente für den Watchtower-Container findest Du hier.
chris
Hallo
Super Anleitung.
Leider habe ich das Problem, das bei der Docker Version 20.10.3-1233 unter Aktion kein Inhalt löschen zu Auswahl steht.
Bitte um Hilfe.
mfg
TOBx2
Falls noch aktuell: es heißt nun “Zurücksetzen”
Dud
Hallo,
super Anleitung.
Ich glaube “Inhalt löschen” –> “zurücksetzen”.
MfG