Zum Inhalt springen
Engineering/Notes

Watchtower: Automatische Docker Container Updates

Markus Schemp
Markus Schemp
29. Januar 2025 · 2 Min. Lesezeit
DockerInfrastrukturPatchmanagement

Softwareupdates zeitnah durchzuführen ist eine der elementaren Grundsäulen so ziemlich jeder IT-Sicherheitsstrategie. Spätestens wenn man mehr als zwei bis drei Dienste selbst betreibt, kann das aber in ein regelrechtes Katz- und Maus-Spiel ausarten: Für welche Dienste gibt es Updates? Welche Dienste habe ich schon aktualisiert? Welche muss ich noch updaten? Mit Watchtower kannst du die Images deiner Docker-Container automatisiert aktuell halten.

So funktioniert Watchtower

Achtung
Watchtower führt automatische Updates ohne deine Mithilfe durch! Sollte im Image etwas nicht stimmen, oder das Update nicht funktioniert haben, kann es sein, dass der Container nicht mehr läuft oder es zu Datenverlust kommt.

Watchtower verbindet sich mit deinem Docker-Socket und kann zyklisch deine laufenden Docker-Container scannen. Gleichzeitig überwacht Watchtower die Registry, von der dein Image stammt. Wenn dort ein neueres, zu deiner Docker-Konfiguration passendes Image vorhanden ist, aktualisiert Watchtower deinen lokalen Container. Fährt ihn also herunter, aktualisiert das Image und fährt ihn wieder hoch.

Ich persönlich nutze Watchtower ausschließlich für Container, wenn ich:

  • regelmäßig, meistens mehrmals im Monat (Sicherheits-)Updates erwarte
  • bisher sehr gute Erfahrungen mit Updates dieses Containers gemacht habe
  • ein funktionierendes Backup konfiguriert habe
  • einen möglichen Ausfall zeitnah mitbekomme (z. B. durch Uptime-Monitoring)

Meine persönliche GitLab-Instanz ist ein gutes Beispiel, wofür ich Watchtower nutze. GitLab veröffentlicht sehr schnell und häufig Sicherheitsupdates und ich hatte noch nie ein Problem bei einem Update.

Watchtower-Setup

Voraussetzungen

Ich gehe davon aus, dass Docker und Docker-Compose auf dem Server installiert sind und du deine Container unter /opt/containers ablegst. Ich verzichte hier auch auf sudo und gehe davon aus, dass du entweder als root angemeldet bist (nicht empfohlen!) oder an den notwendigen Stellen sudo nutzt.

Ordner anlegen und vorbereiten

bash
mkdir -p /opt/containers/watchtower
cd /opt/containers/watchtower

docker-compose.yaml

Lege die docker-compose.yaml an:

bash
nano docker-compose.yaml
docker-compose.yaml
services:
watchtower:
image: containrrr/watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock # Docker Socket
- /etc/localtime:/etc/localtime:ro # Lokale Zeitzone
environment:
- WATCHTOWER_LABEL_ENABLE=true # Watchtower soll ausschließlich markierte Dienste berücksichtigen
- WATCHTOWER_SCHEDULE=0 0 4 * * * # täglich um 04:00 Uhr prüfen
- WATCHTOWER_TIMEOUT=60s # Container nach spätestens 1 Minute zwangsweise stoppen
- WATCHTOWER_INCLUDE_RESTARTING=true # nach dem Update Container neustarten
- WATCHTOWER_CLEANUP=true # nach dem Update nicht mehr benötigte Images aufräumen
- WATCHTOWER_NOTIFICATIONS_LEVEL=info
- WATCHTOWER_NOTIFICATIONS=email # per Mail informieren, was er getan hat
- WATCHTOWER_NOTIFICATION_EMAIL_FROM=${EMAIL_FROM}
- WATCHTOWER_NOTIFICATION_EMAIL_TO=${EMAIL_TO}
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER=${EMAIL_SERVER}
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=${EMAIL_SERVER_USER}
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=${EMAIL_SERVER_PASSWORD}
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=${EMAIL_SERVER_PORT}
labels:
- "com.centurylinklabs.watchtower.enable=true" # sich selbst updaten

.env

Und lege die .env an:

bash
nano .env
.env
EMAIL_FROM="noreply@example.com"
EMAIL_TO="Meine@emailadresse.de"
EMAIL_SERVER="smtp.example.com"
EMAIL_SERVER_PORT="25"
EMAIL_SERVER_USER="noreply@example.com"
EMAIL_SERVER_PASSWORD="geheim"

Anpassungen in der Konfiguration

Für die E-Mail-Benachrichtigungen musst du in der .env-Datei gültige SMTP-Zugangsdaten hinterlegen. Solltest du keine E-Mail-Benachrichtigungen wollen, kannst du auch die WATCHTOWER_NOTIFICATION_* Einträge aus der docker-compose.yaml entfernen und auf die .env verzichten.

Watchtower starten

Jetzt kannst du Watchtower starten – entweder im interaktiven Modus, um ggf. in die Fehlersuche zu gehen, oder direkt im Hintergrund mit der -d Option.

bash
docker compose up
docker compose up -d

Um weitere Container in die Überwachung deines Watchtowers aufzunehmen, müssen diese mit dem richtigen Label versehen sein. Ergänze also ggf. in deinen Docker-Compose-Dateien das Label.

yaml
labels:
- "com.centurylinklabs.watchtower.enable=true"

Markus Schemp
Markus Schemp
Softwareentwickler mit mehr als 15 Jahren Erfahrung in Softwareentwicklung und Engineering und mehr als 10 Jahren technischer Führung. Schwerpunkte: Softwarearchitektur, Modernisierung, DevOps und KI-gestützte Softwareentwicklung.
Profil ansehen
Woran ich sonst arbeiteLeistungen im ÜberblickEngineering Notes entstehen im eigenen Betrieb. Beruflich berate ich Unternehmen, deren Geschäft Software ist oder wird.

Inhalt