Watchtower: Container automatisch aktuell halten
Wie viele deiner Container laufen auf einer veralteten Version – mit Sicherheitslücken oder nervigen Bugs? Watchtower beobachtet deine laufenden Container, zieht neue Images und startet die Container anschließend mit den gleichen Optionen neu. So bleibt dein Docker-Host automatisch aktuell. In diesem Tutorial richtest du Watchtower mit Docker Compose ein.
Warum Watchtower?
Jeder Container, den du selbst hostest, ist auch selbst zu pflegen: Image ziehen, Container neu erstellen, alte Images entsorgen. Bei dutzenden Diensten summiert sich das – und genau hier setzt Watchtower an: Es macht die Update-Routine zu einem automatischen Hintergrunddienst, der dich nur noch im Fehlerfall beschäftigt.
Konzept: prüfen, ziehen, neu starten
- Prüfen: In konfigurierbaren Intervallen fragt Watchtower die Registries nach neuen Images für deine laufenden Container ab.
- Ziehen: Ist eine neue Version verfügbar, wird das frische Image heruntergeladen.
- Neu starten: Der betroffene Container wird mit identischen Optionen (Ports, Volumes, Netzwerk, Env) neu erstellt.
- Aufräumen: Mit
--cleanupwerden alte, nicht mehr verwendete Images anschließend entfernt. - Steuerung: Zeitplan, Umfang und Benachrichtigungen lassen sich über Flags und Docker-Labels fein justieren.
Vorbereitung: nur der Docker-Socket
mkdir -p ~/watchtower
cd ~/watchtower
- Watchtower braucht kein Volume und keinen Port.
- Einzige Voraussetzung ist der Zugriff auf
/var/run/docker.sock– darüber steuert Watchtower deine Container. - Der Socket-Zugriff ist mächtig: Watchtower kann Container starten, stoppen und neu erstellen – behandle das Image und die Konfiguration entsprechend vertrauenswürdig.
Docker Compose – die Datei
Deine Vorlage, bereinigt (leerer networks: {}-Block entfernt) und kommentiert:
services:
watchtower:
image: containrrr/watchtower
container_name: watchtower
restart: always
command:
- --cleanup # alte Images nach dem Update entfernen
- --interval 4800 # Prüf-Intervall in Sekunden (4800 s = 80 min)
volumes:
- /var/run/docker.sock:/var/run/docker.sock
labels:
- "com.centurylinklabs.watchtower.enable=false" # Watchtower selbst nicht automatisch updaten
containrrr/watchtower: offizielles Image (Docker Hub); bei Bedarf Version pinnen (z. B.:1.7.1).--interval 4800: Alle 80 Minuten prüft Watchtower auf neue Images.- Mit dem Label
enable=falseschützt sich Watchtower vor dem eigenen Update-Loop – ihn aktualisierst du dann manuell.
Konfiguration: Flags & Zeitplan
| Flag | Wirkung |
|---|---|
--cleanup | Entfernt alte Images nach erfolgreichem Update – hält den Host schlank. |
--interval <Sekunden> | Prüfintervall; dein Wert 4800 = alle 80 Minuten (Standard: 86400 = täglich). |
--schedule "0 0 4 * * *" | Alternativ ein fester Zeitpunkt per Cron – z. B. täglich um 04:00 Uhr statt Intervall. |
--run-once | Einmalige Prüfung und Beendigung – ideal für manuelle Testläufe. |
--rolling-restart | Startet Container eines Stacks nacheinander neu statt alle auf einmal. |
--stop-timeout <Sekunden> | Wartezeit bis zum erzwungenen Stopp (Standard: 10 s). |
Für einen festen Wartungszeitpunkt ersetzt du in der Compose-Datei die command-Zeilen durch
z. B. --schedule "0 4 * * *" (täglich 04:00 Uhr) – das ist meist verträglicher als ein
ständig laufendes Intervall.
Selektive Updates per Labels
Standardmäßig nimmt Watchtower jeden Container in Angriff. Wer nur ausgewählte Dienste automatisch
aktualisieren will, startet Watchtower mit --label-enable und markiert die gewünschten
Container – umgekehrt schließt enable=false einzelne Dienste aus:
services:
webapp:
image: beispiel/webapp:latest
labels:
# nur mit --label-enable: dieser Container wird aktualisiert
- "com.centurylinklabs.watchtower.enable=true"
database:
image: beispiel/postgres:16
labels:
# Datenbanken lieber manuell aktualisieren:
- "com.centurylinklabs.watchtower.enable=false"
latest-Dienste und unkritische Tools dürfen automatisch laufen.
Datenbanken, Auth-Dienste und Container mit eigenen Migrationen aktualisierst du besser von Hand – mit
Backup und Restore-Plan.
Inbetriebnahme & Testlauf
cd ~/watchtower
docker compose up -d
docker compose logs -f watchtower
- Beim ersten Start protokolliert Watchtower seine Prüfung und meldet gefundene Updates.
- Für einen schnellen Funktionstest einmalig mit
--run-oncestarten:docker run --rm -v /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --run-once --cleanup - Nach einem Update findest du im Log den Hinweis „Found new version“ und den Neustart des Containers.
- Kontrolle:
docker pszeigt die neue Image-Version der aktualisierten Container.
Betrieb: Benachrichtigungen & Socket-Rechte
Damit du nicht in die Logs schauen musst, kann Watchtower Updates melden – über Shoutrrr-Unterstützung reichen dafür E-Mail, Telegram, Discord, Matrix, Slack und viele weitere Kanäle:
services:
watchtower:
image: containrrr/watchtower
environment:
- WATCHTOWER_NOTIFICATION_URL=discord://token@channel-id
- WATCHTOWER_NOTIFICATION_TEMPLATE=image: {{.ImageName}} – update {{.Status}}
- Socket-Rechte bewusst halten: Wer den Socket mounten darf, kann Docker steuern – Watchtower nur in Container-Netzwerken einsetzen, denen du vertraust.
- Kein Reverse Proxy nötig: Watchtower hat keine Oberfläche – der Socket bleibt im lokalen Netz des Hosts.
- Selbst-Update ausschließen: Das Label
enable=falseim eigenen Stack verhindert, dass sich Watchtower selbst neu startet, während er andere Container aktualisiert.
Häufige Probleme (FAQ)
| Problem | Lösung |
|---|---|
| Watchtower aktualisiert auch kritische Container | Dienst ausnehmen: Label com.centurylinklabs.watchtower.enable=false am jeweiligen Container setzen – oder mit --label-enable auf Whitelist umstellen. |
| Updates passieren mitten im Betrieb | Auf festen Zeitpunkt umstellen: --schedule "0 4 * * *" statt --interval. |
| Container startet nach dem Update nicht | Logs prüfen (docker compose logs <dienst>), ggf. --stop-timeout erhöhen oder den Dienst von der Automatik ausnehmen. |
| Nicht alle Container werden aktualisiert | Label-Konflikte prüfen – besonders bei mehreren Watchtower-Instanzen (instance-Label) und --label-enable. |
| Keine Benachrichtigungen trotz URL | Format von WATCHTOWER_NOTIFICATION_URL prüfen (Shoutrrr-Schema) und mit --run-once testen. |
| Alte Images verschwinden nicht | --cleanup ergänzen – und beachten: entfernt werden nur Images, die nach dem Update nicht mehr referenziert werden. |
Fazit
Watchtower ist die einfachste Antwort auf „vergessene Updates“: einmal einrichten, per Labels den Umfang bestimmen und bei Bedarf benachrichtigt werden. Die Automatik ersetzt keine Sorgfalt – wer kritische Dienste von der Automatik ausnimmt und Updates zu einem festen Zeitpunkt plant, bekommt einen Host, der von selbst aktuell bleibt.
--interval oder --schedule wählen, nicht beides.
③ Datenbanken & Migrations-Dienste besser manuell aktualisieren.
④ Mit --run-once jede Änderung erst testen.