Softwareupdates zeitnah durchzuführen ist eine de elementaren Grundsäulen so ziemlich jeder IT Sicherheitsstrategie. Spätestens wenn man mehr als zwei bis drei Dienste selbst betreibt, kann das aber in in ein regelrechtes Katz- und Maus-Spiel ausarten: Für welche Dienste gibt es Updates? Welche Dienste habe ich schon updated? Welche muss ich noch updaten? Mit Watchtower kannst du die Images deiner Docker-Container automatisiert aktuell halten.
So funktioniert Watchtower
ACHTUNG: Watchtower führt automatische Updates ohne deine Mithilfe durch! Sollte im Image etwas nicht stimmen, oder das Update nicht funktioniert haben, kann es sein, dass der Container nicht mehr läuft oder es zu Datenverlust kommt.
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 in 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
- 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öffentlich sehr schnell und häufig Sicherheitsupdates und ich hatte noch nie ein Problem bei eine 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/watchtower
cd /opt/containers/watchtower
docker-compose.yaml
Lege die docker-compose.yaml an:
nano docker-compose.yaml
services:
watchtower:
image: containrrr/watchtower
volumes:
- /var/run/docker.sock:/var/run/docker.sock # Docker Socket
- /etc/localtime:/etc/localtime:ro # Lokale Zeitzone
environment:
- 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 up
docker 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 deine Docker-Compose Dateien das label.
labels:
- "com.centurylinklabs.watchtower.enable=true"