Docker Container automatisch updaten mit Watchtower
Wer einen Homelab oder selbst gehostete Dienste betreibt, kennt das Problem: Container laufen zuverlässig – manchmal wochenlang ohne Aufmerksamkeit. Genau das ist das Problem. Denn während der Container läuft, veröffentlichen die Entwickler neue Images mit Bug-Fixes, Sicherheitspatches und neuen Features. Wer nicht updated, betreibt irgendwann veraltete, potenziell unsichere Software.
Watchtower löst dieses Problem: Es ist selbst ein Docker Container, der alle anderen Container auf dem Host überwacht und automatisch aktualisiert, sobald ein neueres Image verfügbar ist.
Warum sollte man Docker Container updaten?
Sicherheitslücken in Base-Images
Fast jedes Docker Image basiert auf einem Basis-Image – meistens debian, ubuntu, alpine oder node. Diese Basis-Images enthalten Systembibliotheken wie OpenSSL, glibc oder curl. Werden dort Sicherheitslücken (CVEs) entdeckt, veröffentlicht der Maintainer ein gepatchtes Image.
Wer nicht updated, läuft mit einer bekannten Schwachstelle – auch wenn die eigene Anwendung keinen Fehler hat.
Abhängigkeiten und Pakete
Auch die Pakete innerhalb eines Images (z. B. Python-Libraries, npm-Pakete, apt-Pakete) erhalten regelmäßig Sicherheitsupdates. Diese werden in neuen Image-Tags veröffentlicht.
Bug-Fixes und Stabilitätsverbesserungen
Neben Sicherheitspatches beheben neue Image-Versionen oft Fehler, die den normalen Betrieb beeinträchtigen – Speicherlecks, Abstürze, fehlerhafte Konfigurationen.
Compliance-Anforderungen
Wer öffentliche Dienste oder produktive Systeme betreibt, ist oft verpflichtet, bekannte Schwachstellen zeitnah zu beheben. Regelmäßige Updates sind dafür die Grundvoraussetzung.
Was ist Watchtower?
Watchtower ist ein Open-Source-Tool von containrrr, das als Docker Container läuft und folgende Aufgaben übernimmt:
- Überwachen — Watchtower prüft regelmäßig, ob für laufende Container ein neueres Image in der Registry (z. B. Docker Hub) verfügbar ist
- Herunterladen — Ist ein neues Image vorhanden, wird es im Hintergrund gepullt
- Neu starten — Der alte Container wird gestoppt, der neue mit identischer Konfiguration (Ports, Volumes, Umgebungsvariablen) gestartet
- Aufräumen — Das alte Image wird optional gelöscht
Die ursprünglichen Container-Einstellungen bleiben dabei vollständig erhalten.
Watchtower installieren
Schnellstart (einmalig testen)
docker run --rm \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--run-once
Dieser Befehl prüft alle Container einmalig, updated sie falls nötig und beendet sich dann. Ideal zum ersten Test.
Dauerhaft als Container betreiben
docker run -d \
--name watchtower \
--restart unless-stopped \
-v /var/run/docker.sock:/var/run/docker.sock \
containrrr/watchtower \
--cleanup \
--interval 86400
| Parameter | Bedeutung |
|---|---|
| -d | Container im Hintergrund starten |
| --restart unless-stopped | Container nach Neustart des Hosts automatisch starten |
| -v /var/run/docker.sock | Zugriff auf den Docker-Daemon des Hosts |
| --cleanup | Alte Images nach dem Update automatisch löschen |
| --interval 86400 | Prüfintervall in Sekunden (hier: 24 Stunden) |
Mit Docker Compose (empfohlen)
Für Homelab-Setups ist Docker Compose übersichtlicher. Erstelle eine Datei docker-compose.yml:
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_SCHEDULE=0 0 4 * * * # täglich um 04:00 Uhr
- WATCHTOWER_NOTIFICATIONS=email
- WATCHTOWER_NOTIFICATION_EMAIL_FROM=watchtower@deinedomain.de
- WATCHTOWER_NOTIFICATION_EMAIL_TO=dich@deinedomain.de
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER=smtp.deinedomain.de
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PORT=587
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=watchtower@deinedomain.de
- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=deinPasswort
Starten:
docker compose up -d
Zeitplan konfigurieren (Cron-Syntax)
Mit WATCHTOWER_SCHEDULE lässt sich der Update-Zeitpunkt präzise steuern. Watchtower verwendet 6-stellige Cron-Ausdrücke:
WATCHTOWER_SCHEDULE=0 0 4 * * *
┌─────────── Sekunde (0-59)
│ ┌───────── Minute (0-59)
│ │ ┌─────── Stunde (0-23)
│ │ │ ┌───── Tag (1-31)
│ │ │ │ ┌─── Monat (1-12)
│ │ │ │ │ ┌─ Wochentag (0-6, 0=Sonntag)
│ │ │ │ │ │
0 0 4 * * * → täglich um 04:00 Uhr
0 0 4 * * 0 → jeden Sonntag um 04:00 Uhr
0 0 3 1 * * → am 1. jedes Monats um 03:00 Uhr
Empfehlung: Updates nachts oder früh morgens planen – zu Zeiten mit wenig Traffic und damit kurzen Downtimes beim Neustart.
Bestimmte Container ausschließen
Nicht jeder Container sollte automatisch geupdated werden – z. B. wenn du eine spezifische Version einer Datenbank einsetzen musst oder Updates erst manuell testen möchtest.
Container von Watchtower ausschließen mit einem Label:
services:
meine-datenbank:
image: postgres:16.2
labels:
- "com.centurylinklabs.watchtower.enable=false"
Alternativ: Watchtower nur für bestimmte Container aktivieren (Opt-In statt Opt-Out):
# Watchtower nur Container updaten lassen, die das Label tragen
services:
watchtower:
image: containrrr/watchtower
environment:
- WATCHTOWER_LABEL_ENABLE=true
...
nginx:
image: nginx:alpine
labels:
- "com.centurylinklabs.watchtower.enable=true" # wird geupdated
Benachrichtigungen einrichten
Watchtower kann dich nach jedem Update benachrichtigen. Neben E-Mail werden auch folgende Dienste unterstützt:
Gotify (Self-Hosted Push-Notifications):
environment:
- WATCHTOWER_NOTIFICATIONS=gotify
- WATCHTOWER_NOTIFICATION_GOTIFY_URL=https://gotify.deinedomain.de
- WATCHTOWER_NOTIFICATION_GOTIFY_TOKEN=deinToken
Slack:
environment:
- WATCHTOWER_NOTIFICATIONS=slack
- WATCHTOWER_NOTIFICATION_SLACK_HOOK_URL=https://hooks.slack.com/services/...
Shoutrrr (universell – Discord, Telegram, ntfy, Matrix u. v. m.):
environment:
- WATCHTOWER_NOTIFICATIONS=shoutrrr
- WATCHTOWER_NOTIFICATION_URL=discord://token@channel
# oder: ntfy://deinedomain.de/watchtower
# oder: telegram://botToken@telegram?channels=chatId
Sicherheitshinweis: Docker Socket
Watchtower benötigt Zugriff auf den Docker Socket (/var/run/docker.sock). Das ist notwendig, weil nur darüber Container gesteuert werden können – aber es ist ein mächtiger Zugriff: Ein Container mit Socket-Zugriff kann theoretisch alle anderen Container auf dem Host steuern.
Empfehlungen:
- Watchtower nur auf vertrauenswürdigen Hosts betreiben
- Den Watchtower-Container selbst von Auto-Updates ausschließen und manuell updaten:
labels:
- "com.centurylinklabs.watchtower.enable=false"
- Wenn möglich, Watchtower nur für spezifische Container (Opt-In mit
WATCHTOWER_LABEL_ENABLE=true) aktivieren
Fazit
Veraltete Docker Container sind eines der häufigsten Sicherheitsprobleme in selbst gehosteten Setups. Watchtower nimmt einem die manuelle Arbeit ab und sorgt dafür, dass Images aktuell bleiben – vollautomatisch, mit Benachrichtigungen und flexiblen Zeitplänen.
Für ein typisches Homelab-Setup reicht diese Konfiguration:
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: unless-stopped
volumes:
- /var/run/docker.sock:/var/run/docker.sock
environment:
- WATCHTOWER_CLEANUP=true
- WATCHTOWER_SCHEDULE=0 0 4 * * *
labels:
- "com.centurylinklabs.watchtower.enable=false"
Damit hast du automatische Updates täglich um 04:00 Uhr, alte Images werden aufgeräumt, und Watchtower selbst schließt sich von Auto-Updates aus.