// Tutorial · Docker · Update-Management

Watchtower: Container automatisch aktuell halten

📅 05.09.2026 ⏱ 8 Min. Lesezeit ✍️ Redaktion

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.

Kein Web-UI-Dienst: Watchtower bringt bewusst keine Oberfläche und keinen eigenen Port mit – er läuft als stiller Wächter im Hintergrund und meldet sich über Logs oder Benachrichtigungen.

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 --cleanup werden 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=false schützt sich Watchtower vor dem eigenen Update-Loop – ihn aktualisierst du dann manuell.
Automatik = Verantwortung: Ohne weitere Einschränkung aktualisiert Watchtower alle Container auf dem Host – auch Datenbanken oder kritische Dienste, deren Update ein manuelles Eingreifen erfordert. Plane den Zeitpunkt (siehe Konfiguration) und nutze für heikle Dienste die Label-Strategie aus dem nächsten Abschnitt.

Konfiguration: Flags & Zeitplan

FlagWirkung
--cleanupEntfernt 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-onceEinmalige Prüfung und Beendigung – ideal für manuelle Testläufe.
--rolling-restartStartet 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"
Faustregel: 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-once starten: 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 ps zeigt 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=false im eigenen Stack verhindert, dass sich Watchtower selbst neu startet, während er andere Container aktualisiert.

Häufige Probleme (FAQ)

ProblemLösung
Watchtower aktualisiert auch kritische ContainerDienst ausnehmen: Label com.centurylinklabs.watchtower.enable=false am jeweiligen Container setzen – oder mit --label-enable auf Whitelist umstellen.
Updates passieren mitten im BetriebAuf festen Zeitpunkt umstellen: --schedule "0 4 * * *" statt --interval.
Container startet nach dem Update nichtLogs prüfen (docker compose logs <dienst>), ggf. --stop-timeout erhöhen oder den Dienst von der Automatik ausnehmen.
Nicht alle Container werden aktualisiertLabel-Konflikte prüfen – besonders bei mehreren Watchtower-Instanzen (instance-Label) und --label-enable.
Keine Benachrichtigungen trotz URLFormat 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.

Die vier Merksätze: ① Watchtower aktualisiert standardmäßig alle Container – Labels setzen. ② --interval oder --schedule wählen, nicht beides. ③ Datenbanken & Migrations-Dienste besser manuell aktualisieren. ④ Mit --run-once jede Änderung erst testen.
📝
....

Wir betreiben unsere komplette Infrastruktur selbst auf Open-Source-Software und schreiben nur über Tools, die wir im Alltag wirklich einsetzen. Fragen zum Artikel? Schreib uns.