← Zurück zum Blog

Docker Container automatisch updaten mit Watchtower

5 Min. Lesezeit
DockerWatchtowerSecurityHomelabAutomatisierung

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:

  1. Überwachen — Watchtower prüft regelmäßig, ob für laufende Container ein neueres Image in der Registry (z. B. Docker Hub) verfügbar ist
  2. Herunterladen — Ist ein neues Image vorhanden, wird es im Hintergrund gepullt
  3. Neu starten — Der alte Container wird gestoppt, der neue mit identischer Konfiguration (Ports, Volumes, Umgebungsvariablen) gestartet
  4. 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.

Kommentare