ADMIN
2021
05
2021-05-01T12:00:00
Hybrid Cloud
PRAXIS
060
Hybrid Cloud
Cloud
Docker-Container mit Watchtower aktualisieren
Ausschau nach Updates
von Matthias Wübbeling
Veröffentlicht in Ausgabe 05/2021 - PRAXIS
Das automatische Aktualisieren eingesetzter Software ist eine Voraussetzung für die sichere Bereitstellung von Diensten und Infrastrukturen. Der fortschreitende Einsatz von Microservices und damit die Bereitstellung individuell angepasster Ökosysteme innerhalb von Containern führt schnell zu einem unübersichtlichen Update-Dschungel. Der Security-Tipp in diesem Monat präsentiert Ihnen Watchtower für das automatische Aktualisieren Ihrer Docker-Container.

Das Deployment von Microservices mit Docker ist verhältnismäßig einfach. Ohne viel Aufwand können Sie in Ihrem Unternehmen komplexe Software-Installationen vornehmen und Dienste anbieten. Eine so schnell gewachsene Infrastruktur zu kontrollieren, ist dann häufig viel aufwendiger als die Bereitstellung selbst. Unabhängig davon, wie Sie Ihre Docker-Container verwalten – ob direkt mit Docker selbst, Docker Compose oder einem der vielen anderen Werkzeuge: Neben einem funktionierenden Backup will auch für das möglichst automatisierte Softwareupdate gesorgt sein.
Die automatische Aktualisierung ist immer öfter Bestandteil von IT-Sicherheitsstrategien in Unternehmen. Geht dabei etwas schief, ist ein nicht erreichbarer Dienst in vielerlei Hinsicht weniger kritisch als ein durch Angreifer verwundbarer Dienst. Mögliche Ausfallzeiten werden dann durch enges Monitoring und Fallback-Strategien ergänzt.
Watchtower starten
Die erste Einrichtung von Watchtower entspricht in Umfang und Komplexität in etwa dem Wechsel einer Glühbirne. Wenn alle Werkzeuge bereitgelegt sind und der Docker-Daemon läuft, starten Sie Watchtower mit dem folgenden Kommando:
Das Deployment von Microservices mit Docker ist verhältnismäßig einfach. Ohne viel Aufwand können Sie in Ihrem Unternehmen komplexe Software-Installationen vornehmen und Dienste anbieten. Eine so schnell gewachsene Infrastruktur zu kontrollieren, ist dann häufig viel aufwendiger als die Bereitstellung selbst. Unabhängig davon, wie Sie Ihre Docker-Container verwalten – ob direkt mit Docker selbst, Docker Compose oder einem der vielen anderen Werkzeuge: Neben einem funktionierenden Backup will auch für das möglichst automatisierte Softwareupdate gesorgt sein.
Die automatische Aktualisierung ist immer öfter Bestandteil von IT-Sicherheitsstrategien in Unternehmen. Geht dabei etwas schief, ist ein nicht erreichbarer Dienst in vielerlei Hinsicht weniger kritisch als ein durch Angreifer verwundbarer Dienst. Mögliche Ausfallzeiten werden dann durch enges Monitoring und Fallback-Strategien ergänzt.
Watchtower starten
Die erste Einrichtung von Watchtower entspricht in Umfang und Komplexität in etwa dem Wechsel einer Glühbirne. Wenn alle Werkzeuge bereitgelegt sind und der Docker-Daemon läuft, starten Sie Watchtower mit dem folgenden Kommando:
docker run -d --name watchtower \ -v /var/run/docker.sock:/var/run/docker.sock \containrrr/watchtower
Dabei schicken Sie den gestarteten Container mit "-d" für detach direkt in den Hintergrund. Den mit "--name" angegebenen Namen können Sie frei wählen. Mit der Option "-v" binden Sie Bereiche des Dateisystems als Volume in die Prozessgruppe des Containers mit ein. Das obige Kommando schließt den Kommunikations-Socket des Docker-Daemons mit ein, denn darüber kommuniziert Watchtower und übermittelt seine Kommandos. Das letzte Argument der Kommandozeile übergibt den Watchtower-Pfad in der Docker-Hub-Registry [1].
Einmal gestartet, übernimmt Watchtower direkt die Kontrolle und überwacht für alle laufenden Docker-Container die Verfügbarkeit neuer Image-Versionen. Steht eine neue Version bereit, lädt Watchtower diese herunter und startet die betroffenen Container neu. Dabei werden alle Parameter der Container – also die, die Sie mit docker run
angegeben haben – berücksichtigt und beim Neustart entsprechend übergeben. So bleiben eingebundene Volumes und freigegebene Ports auch bei Updates erhalten.
Dabei ist zu beachten, dass Watchtower auch Tags berücksichtigt, die Sie den Images anhängen. Das wohl bekannteste Tag ist "latest". Damit zeigt der Ersteller eines Images an, dass es sich um die aktuellste verfügbare Version handelt. Bei einem Update von "latest" führt Watchtower aber auch Sprünge auf neue Major-Release-Versionen durch. Für eine beliebige Software mit der Version 3.8.12 könnte dann Version 4.0.1 als aktualisiertes Image gestartet werden. Das ist nicht immer gewollt.
Lässt die eingesetzte Software etwa über ein Plug-in-System Erweiterungen zu, sind diese häufig nicht unmittelbar kompatibel mit dem nächsthöheren Major-Release. Daher gilt es unter Erstellern von Docker-Images als gute Praxis, möglichst umfassende Tags zu vergeben. Eine Version 3.8.12 bekommt dann zum Zeitpunkt der Veröffentlichung die Tags "latest", "3", "3.8" und "3.8.12". So können Sie als Administrator Ihre gewünschte Version und damit die Update-Strategie für Watchtower festlegen. Starten Sie ein Image mit ":3", erhalten Sie zukünftig Version 3.9, 3.10 und folgende. Mit ":3.8" erhalten Sie dann 3.8.13 und weitere und mit ":3.8.12" werden Sie keine Updates erhalten.
Updates selektiv verteilen
Die wohl wichtigste Eigenschaft, die Entwickler einem Docker-Image mitgeben können, ist die Update- und Migrationsfähigkeit der enthaltenen Anwendung. Das bedeutet, dass das Einspielen neuer Container-Images auch die automatische Anpassung aller notwendigen Konfigurations- und Datenbankeinstellungen der bereitgestellten Software beim Start zur Folge hat. Es liegt also am Einstiegspunkt eines Containers, der als RUN-Kommando innerhalb des Dockerfiles konfiguriert ist, ob sich ein Container-Image ohne Schwierigkeiten aktualisieren lässt. Die meisten offiziellen Images besitzen diese Fähigkeit.
Unter Umständen möchten Sie vielleicht nur ausgewählte Container automatisch von Watchtower aktualisieren lassen. Docker ermöglicht Ihnen, dem Einstiegspunkt eines Containers über das docker run
-Kommando weitere Argumente mitzugeben. Watchtower nutzt diese Möglichkeit zur Übergabe von Containernamen, um festzustellen, welche Container es aktualisieren soll. Um ausschließlich die Container mit den Namen Nextcloud, Elasticsearch und Mailman einzubeziehen, erweitern Sie also das bereits erwähnte Kommando wie folgt:
docker run -d --name watchtower \ -v /var/run/docker.sock:/var/run/docker.sock \containrrr/watchtower Nextcloud Elasticsearch Mailman
Berücksichtigen Sie dabei, dass Sie mit dieser Auswahl auch Watchtower selbst aus der Liste der automatisch aktualisierten Container entfernen. Wenn sich das Werkzeug also selbst aktualisieren soll, müssen Sie es in diesem Fall auch mit angeben.
Eine weitere Möglichkeit, Container auszuwählen, besteht über sogenannte Container-Label. Diese geben Sie einem Container beim Start über die Option "-l" mit. Ein Vorteil dieser Methode ist, dass Sie damit auch Container auswählen können, die Sie erst nach dem Start von Watchtower erstellen. Sie übergeben dann Watchtower beim docker run
-Kommando über die Umgebungsvariable "-e WATCHTOWER_LABEL_ENABLE=1" die Information, nur Container mit entsprechendem Label zu aktualisieren.
Allen anderen Containern, die Sie vor oder nach Watchtower starten, fügen Sie mit "-l com.centurylinklabs.watchtower. enable="true"" das entsprechende Label hinzu. Beachten Sie auch hier: Wenn Watchtower sich selbst aktualisieren soll, starten Sie auch den Container mit dem entsprechenden Label.
Zeitpläne und Probeläufe erstellen
Wenn Sie die Uhrzeiten kontrollieren möchten, zu denen Watchtower die Container überprüft, nutzen Sie die Umgebungsvariable "WATCHTOWER_SCHEDULE". Die Variable füllen Sie mit einer Zeichenkette in der sogenannten erweiterten CRON-Syntax der Programmiersprache GO, auf der Watchtower im Wesentlichen fußt [2]. Diese entspricht der bekannten CRON-Syntax von Ihrem UNIX-System, wobei noch ein Feld für Sekunden voransteht. Soll Watchtower alle sechs Stunden aktiv werden, fügen Sie dem docker run
-Kommando das Argument "-e WATCHTOWER_SCHEDULE="0 0 */6 * * *"" hinzu.
Verwenden Sie wie schon besprochen Container, bei denen automatische Updates schwierig sind oder nur unzuverlässig funktionieren, können Sie Watchtower auch so konfigurieren, dass es Container-Images nur auf Updates untersucht und Sie bei verfügbaren benachrichtigt. Watchtower unterstützt hier verschiedene Wege wie E-Mail oder Instant Messaging über Slack, Microsoft Teams und weitere Dienste.
Um eine Benachrichtigung per E-Mail zu aktivieren, müssen Sie zunächst den entsprechenden Container mit einem Label vor automatischen Updates schützen, indem Sie "-lcom.centurylinklabs.watchtower.monitor-only="true"" beim Erstellen des Containers mit angeben. Die Watchtower-Umgebung erweitern Sie dem Listing "E-Mail-Gateway konfigurieren" entsprechend mit den Umgebungsvariablen zur Konfiguration eines E-Mail-Gateways. So bleiben Sie dauerhaft gut informiert und können bei bereitstehenden Updates die Aktualisierung manuell anstoßen.
Listing: E-Mail-Gateway konfigurieren
-e WATCHTOWER_NOTIFICATIONS=email
-e WATCHTOWER_NOTIFICATION_EMAIL_FROM=wt@it-administrator.de
-e WATCHTOWER_NOTIFICATION_EMAIL_TO= notify@it-administrator.de
-e WATCHTOWER_NOTIFICATION_EMAIL_SERVER=s mtp.it-administrator.de
-e WATCHTOWER_NOTIFICATION_EMAIL_ SERVER_PORT=587
-e WATCHTOWER_NOTIFICATION_EMAIL_S ERVER_USER=from
-e WATCHTOWER_NOTIFICATION_EMAIL_ SERVER_PASSWORD=password
-e WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2
Fazit
Um Ihre laufenden Docker-Container auf aktuellem Stand zu halten, fügen Sie Watchtower als weiteren Container Ihrer Umgebung hinzu. Die erste Konfiguration gelingt spielend einfach, wobei die umfassenden Konfigurationsmöglichkeiten von Watchtower nur wenige Wünsche offenlassen. In diesem Security-Tipp haben wir Ihnen die ersten Schritte für die Verwendung und automatische Aktualisierung von Software im Docker-Universum mit Watchtower aufgezeigt.
(dr)