Ein Blog über Code, Hardware und Co

NAS, Server und Co

Synology NAS: Docker Container automatisch updaten

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:

  1. Die Docker-Anwendung aufrufen
  2. Auf “Registrierung” klicken und das neue Image herunterladen/registrieren
  3. Den laufenden Container stoppen
  4. Rechtsklick auf den jeweiligen Container, Aktion und dann “Inhalt löschen” auswählen
  5. 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:

  1. Einen manuelle Ausführung des Watchtower-Images
  2. 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:

ParameterBedeutung
docker runDocker-Run-Command zum Starten eines Docker-Containers
-dDer Container soll detached (also im Hintergrund) laufen
–name watchtowerjobDer Name des Watchtowercontainers (beliebig)
-v /var/run/docker.sock:/var/run/docker.sockDa 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:latestDas image (mit dem latest-Tag) aus dem der Watchtower-Container gebaut wird
–cleanupAlte 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-stoppedAuch aktuell gestoppte Container sollen in das Update einbezogen werden.
–run-onceSorgt dafür, dass der Container nur einmal ausgeführt wird.
Tabelle 1: Aufbau eines einmaligen Update-Befehls mittels Watchtower-Image.

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"
ParameterBedeutung
docker runDocker-Run-Command zum Starten eines Docker-Containers
-dDer Container soll detached (also im Hintergrund) laufen
–restart unless-stoppedDer Container soll immer wieder neu gestartet werden, bis er manuell gestopt wird.
–name watchtowercontinuouslyDer Name des Watchtowercontainers (beliebig)
-v /var/run/docker.sock:/var/run/docker.sockDa 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/watchtowerDas image (mit dem latest-Tag) aus dem der Watchtower-Container gebaut wird
–cleanupAlte 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-stoppedAuch 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.
Tabelle 2: Parameter für einen kontinuierlich laufenden Watchtower-Container.

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.

Schreibe eine Antwort