Watchtower – Automatisch Docker Container aktualisieren

Man kennt das, die Docker Images wurden aktualisiert, man hat allerdings nicht wirklich mitbekommen, dass das passiert ist und dann muss man auch noch umständlich den Container löschen und mit den selben Attributen wieder starten. Das ist doch alles viel zu kompliziert. Watchtower hilft dabei, Docker Container aktuell zu halten.

Konfiguration und Starten

In der Standardkonfiguration, wenn Watchtower einfach gestartet wird, wird jeden Tag nach aktuellen Images gesucht und diese dann automatisch installiert. Kann man machen, ist aber nicht optimal. Es sollte besser die Docker Images monitoren und anschließend informieren. Somit kann geprüft werden, ob sich das neue Docker Image gravierend verändert hat. Die Aktualisierung wird dann manuell angestoßen.

Dazu werden wir zwei Docker-Compose Dateien erstellen. Die Anleitung bezieht sich auf einem Raspberry Pi, kann aber auf so gut wie jede Debian-basierte Installation angewand werden.

Für die Installation von Docker verweise ich da mal gekonnt auf meinen Beitrag Raspberry Pi: Docker installieren.

Monitoring only

  1. Zuerst verbindet man sich auf dem Raspberry Pi und meldet sich an.
  2. Als nächstes wird mit dem Befehl “mkdir watchtower” ein neuer Ordner im Home Verzeichnis erstellt.
  3. Als nächstes wechselt man mit “cd watchtower” in das Verzeichnis und führt “nano docker-compose.yml” aus.
  4. Folgende Eintragung wird nun in die neue Datei geschrieben:
version: "3"
services:
  watchtower-monitor:
    image: containrrr/watchtower
    container_name: watchtower-monitor
    environment:
       - TZ=Europe/Berlin
       - WATCHTOWER_INCLUDE_STOPPED=true
       - WATCHTOWER_SCHEDULE=0 0 0 * * 6
       - WATCHTOWER_MONITOR_ONLY=true
       - WATCHTOWER_NOTIFICATIONS=email
       - WATCHTOWER_NOTIFICATION_EMAIL_FROM={Sendermailadresse}
       - WATCHTOWER_NOTIFICATION_EMAIL_TO={Empfängermailadresse}
       - WATCHTOWER_NOTIFICATION_EMAIL_SERVER={SMTP-Serveradresse}
       - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587
       - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER={E-Mailaccountadresse, normalerweise gleich wie Sendermailadresse}
       - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=/sec/smtp
       - WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2
       - WATCHTOWER_NOTIFICATION_EMAIL_SUBJECTTAG={Zusätzlicher Tag zur Identifizierung}
    volumes:
       - /var/run/docker.sock:/var/run/docker.sock
       - ./sec/:/sec/
    restart: unless-stopped

In der Konfiguration wird eine Mailbenachrichtigung eingerichtet. Was nützt einem das Programm, wenn man nicht weiß, dass was passiert ist.
Alle geschweiften Klammern werden dabei von euch ausgefüllt. Die SMTP-Serveradresse bekommt ihr meist auf einer Informationsseite bei eurem E-Mailprovider.

Als Erklärung der Docker-Compose:
version: “3” = Definiert die Version der benötigten Docker Engine und damit einhergehend, welche Funktionen vorhanden sind.
watchtower-monitor: = Der Name des Docker Containers.
TZ=Europe/Berlin = Legt die Zeitzone fest. Ist wichtig, damit der Cronjob zur richtigen Zeit ausgeführt wird. Eine komplette Liste von gültigen Eingaben findet man unter https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
WATCHTOWER_INCLUDE_STOPPED=true = Sorgt dafür, dass auch gestoppte Container auf aktualisierte Images geprüft werden.
WATCHTOWER_SCHEDULE=0 0 0 * * 6 = Anhand eines Cronjob wird die Prüfung durchgeführt – hier jeden Samstag um Mitternacht. Falls man dies ändern möchte kann man dazu als Hilfe diese Webseite verwenden: https://pkg.go.dev/github.com/robfig/cron@v1.2.0#hdr-CRON_Expression_Format
WATCHTOWER_MONITOR_ONLY=true = Sorgt dafür, das nur geprüft wird. Die Docker Container werden dabei nicht aktualisiert.
WATCHTOWER_NOTIFICATIONS=email = Gibt Watchtower mit, dass die Benachrichtigung zu Aktualisierungen über E-Mail passieren soll. Es gibt bspw. auch die Möglichkeit MS Teams oder Gotify einzubinden (https://containrrr.dev/watchtower/notifications/)
WATCHTOWER_NOTIFICATION_EMAIL_… = Dort müsstet ihr eure Maildaten eintragen, damit die Mailbenachrichtigung auch korrekt funktioniert.
WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=/sec/smtp = Man kann hier das Passwort in Klartext zu dem E-Mailaccount direkt eintragen, ich habe mich allerdings dagegen entschieden. Stattdessen wird das Passwort, ebenfalls in Klartext, in die Datei abgelegt, woraufhin Watchtower diese dann ausliest. Das addiert zumindest einen Schritt mehr, aus IT-Sicherheitssicht ist das aber ebenfalls nicht die beste Lösung. Wenn möglich sollte man einen SMTP Relay aufbauen und diesen verwenden. Einfachheitshalber für den privaten Gebrauch ist das aber mit Zähneknirschen und beiden Augen zudrücken machbar. Es sollte, wenn möglich, ein Separater und nicht der primäre Mailaccount verwendet werden.
WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2 = Die E-Mail wird 2 Sekunden später gesendet.
WATCHTOWER_NOTIFICATION_EMAIL_SUBJECTTAG= = Hier kann ein Servername oder eine andere Bezeichnung eingegeben werden, damit Mails bei mehreren Docker Instanzen besser unterscheidbar sind. Kann aber entfernt werden, wenn nicht benötigt.
volumes: – Unter volumes: wird einmal der Docker Socket in Watchtower integriert. Damit kann Watchtower überhaupt erst auf die Docker Container zugreifen. Und ./sec/ wird hinzugefügt, um die Passwort-Datei in Watchtower verfügbar zu machen.

  1. Die Docker-Compose Datei wird nun mit [STRG]+[O] gespeichert und Nano wird mit [STRG]+[X] geschlossen.
  2. Es muss noch mit “mkdir sec” der entsprechende Ordner für die Passwort-Datei erstellt werden.
  3. Ein “nano sec/smtp” öffnet ein leeren Editor wo nur das Passwort für den Mailaccount zum senden der Benachrichtigung reingeschrieben wird.
  4. Die Datei mit [STRG]+[O] speichern und Nano mit [STRG]+[X] schließen.
  5. Zum Schluss führen wir den Befehl “sudo docker-compose up -d” aus. Watchtower wird gestartet. Wenn alles läuft, wird man eine E-Mail mit dem Logstatus erhalten.
    • Man kann allerdings auch mit dem Befehl “sudo docker logs watchtower_watchtower-monitor_1” prüfen, ob Watchtower läuft.

Somit bekommt ihr nun immer eine Benachrichtigung, ob Docker Images aktualisiert wurden und somit vorhandene Docker Container aktualisiert werden müssen.

Wollt ihr im Übrigen den Watchtower Container aktualisieren, führt einfach nach der Benachrichtigung “sudo docker-compose up -d” im Watchtower Verzeichnis aus, dann wird automatisch das neueste Image verwendet.

Manuelles Update

Für die Aktualisierung der Docker Container werden wir nun eine zweite Docker-Compose Yaml-Datei schreiben, welche dann manuell per Befehl ausgeführt wird.

  1. “nano watchtower-updater.yml” ausführen.
  2. In die neue Datei kommt ein ähnliches Skript wie beim Monitoring:
version: "3"
services:
  watchtower-updater:
    image: containrrr/watchtower
    container_name: watchtower-updater
    environment:
       - TZ=Europe/Berlin
       - WATCHTOWER_INCLUDE_STOPPED=true
       - WATCHTOWER_RUN_ONCE=true
       - WATCHTOWER_CLEANUP=true
       - WATCHTOWER_ROLLING_RESTART=true
       - WATCHTOWER_NOTIFICATIONS=email
       - WATCHTOWER_NOTIFICATION_EMAIL_FROM={Sendermailadresse}
       - WATCHTOWER_NOTIFICATION_EMAIL_TO={Empfängermailadresse}
       - WATCHTOWER_NOTIFICATION_EMAIL_SERVER={SMTP-Serveradresse}
       - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587
       - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER={E-Mailaccountadresse, normalerweise gleich wie Sendermailadresse}
       - WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=/sec/smtp
       - WATCHTOWER_NOTIFICATION_EMAIL_DELAY=2
       - WATCHTOWER_NOTIFICATION_EMAIL_SUBJECTTAG={Zusätzlicher Tag zur Identifizierung}
    volumes:
       - /var/run/docker.sock:/var/run/docker.sock
       - ./sec/:/sec/

Kurz erklärt:
WATCHTOWER_RUN_ONCE=true = Führt den Watchtower Docker Container einmalig aus und aktualisiert sofort alle möglichen Docker Container. Anschließend wird der Watchtower Container gestoppt.
WATCHTOWER_CLEANUP=true = Nach erfolgreicher Aktualisierung werden die alten Docker Images entfernt.
WATCHTOWER_ROLLING_RESTART=true = Die Docker Container werden nacheinander aktualisiert und neu gestartet. Gestoppte Container bleiben gestoppt.

  1. Die Datei mit [STRG]+[O] speichern und Nano mit [STRG]+[X] schließen.
  2. Wenn nun “sudo docker-compose –file watchtower-updater.yml up -d” ausgeführt wird, werden die Docker Container aktualisiert, eine E-Mailbenachrichtigung geht raus und der Watchtower-Updater Container wird wieder gestoppt.

Damit ist ein großer administrativer Aufwand bei den Docker Containern vereinfacht. Dennoch ist es ratsam nicht blind irgendwelche Aktualisierungen zu tätigen. Man sollte immer in die Patch-Notes der aktuelleren Images schauen, ob sich Environment-Variablen oder allgemein die Verwendung des Docker Image geändert hat.

Schreibe einen Kommentar

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