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
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
mkdir -p /opt/containers/watchtowercd /opt/containers/watchtower
docker-compose.yaml
Lege die docker-compose.yaml an:
nano docker-compose.yaml
services:watchtower:image: containrrr/watchtowervolumes:- /var/run/docker.sock:/var/run/docker.sock # Docker Socket- /etc/localtime:/etc/localtime:ro # Lokale Zeitzoneenvironment:- 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:
nano .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.
docker compose updocker 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.
labels:- "com.centurylinklabs.watchtower.enable=true"
