$ goroot_ Notizen von der Schnittstelle
· docker, monitoring, security, debian, linux · 3 min

Unbeaufsichtigte Docker-Container-Updates

Deine Dienste in Containern laufen zu lassen ist praktisch — aber sie aktuell zu halten ist eine andere Geschichte, und es gibt bequemere Wege als das von Hand zu tun.

Maschinell aus dem Englischen übersetzt, vom Autor geprüft. Englisches Original

Um deine Container-Infrastruktur aktuell und damit sicher zu halten, gibt es zwei primäre Ziele, die du erreichen musst:

  1. Das Betriebssystem des Hosts aktuell halten
  2. Den Inhalt deiner Container aktuell halten

Das Betriebssystem aktualisieren

Dein Betriebssystem zu aktualisieren ist ziemlich unkompliziert. Nutze einfach die bekannten Paketmanager, die das für dich erledigen. Für Debian wäre das zum Beispiel so einfach wie regelmäßig apt-get update && apt-get upgrade auszuführen.

Um die Ausführung dieser beiden Befehle zu automatisieren, gibt es mehrere Ansätze. Entweder du konfigurierst einen Cronjob, der diese Befehle regelmäßig ausführt, oder du entscheidest dich für eine ausgefeiltere Lösung.

Für apt gibt es ein Paket namens unattended-upgrades. Das Paket kümmert sich darum, täglich alle Sicherheitsupdates zu installieren. Es lässt sich vollständig über /etc/apt/apt.conf.d/50-unattended-Upgrades konfigurieren.

Container aktualisieren

Um Docker-Container automatisch zu aktualisieren, musst du nicht nur den Upgrade-Prozess selbst berücksichtigen.

Das Risiko der Inkompatibilität

Es gibt viele Container, die nicht automatisch sicherstellen, dass auch die Daten (z. B. Datenbanken oder Konfigurationen) aktualisiert werden. Es könnte sogar eine neuere Version deines Dienstes geben, die mit der Datenbank in deinem Sidecar-Container nicht kompatibel ist. Wenn du nur einen von beiden aktualisierst, könntest du am Ende mit völlig unbrauchbaren Diensten dastehen.

Um dieses Risiko zu mindern, kannst du mehrere Dinge tun:

  • Nutze feste Container-Versionen in deiner docker-compose.yaml. Wenn du keinen Image-Tag angibst, verwendet Docker implizit latest als Image-Tag. Das bedeutet, dass du bei einem unbeaufsichtigten Upgrade immer die neueste Version bekommst — selbst wenn diese Version Änderungen mit sich bringt, die die API zu einem deiner anderen Dienste brechen. Wirf einfach einen Blick auf die verfügbaren Tags für dein Image. Oft gibt es einen Tag, mit dem du dich nur auf die Hauptversion des Images beschränken kannst. Zum Beispiel würde nginx:2 nur Upgrades auf andere Versionen erlauben, die mit 2 beginnen, was hoffentlich keine brechenden API-Änderungen enthält.
  • Stelle sicher, dass du automatisierte Daten-Backups eingerichtet hast. Zum Beispiel, indem du die Cloud als deinen Panic Room nutzt. Wenn du eine neue Version eines Images ziehst, besteht immer das Risiko, dass deine Daten beschädigt werden. Das gilt sogar für Images, die deine Daten migrieren. Migrationsprozesse können scheitern!
  • Richte Monitoring mit Alarmierung ein. Für den seltenen Fall, dass ein Upgrade fehlschlägt, musst du das sofort erfahren. Monitoring-Systeme wie Prometheus[arch] bieten eine einfache Möglichkeit zu erkennen, wenn ein Container ausgefallen oder ein Webdienst nicht mehr erreichbar ist.

Unbeaufsichtigte Container-Updates via Cron

Um unbeaufsichtigte Container-Upgrades umzusetzen, kannst du die Standard-Docker-Befehle nutzen, die du bereits kennst. Lege einfach das folgende Skript in /etc/cron.daily/ ab, und du bist startklar:

/etc/cron.daily/update-containers #L1-L5
1#!/bin/bash
2
3cd /my-docker-compose-project
4docker-compose pull
5docker-compose up -d --remove-orphans

Dadurch werden täglich die neuesten, in deinem docker-compose-Projekt referenzierten Image-Versionen heruntergeladen, die Container mit den aktualisierten Images neu gestartet und alte, nicht mehr im Projekt enthaltene Container entfernt.

Unbeaufsichtigte Container-Updates via Watchtower

Es gibt ein hervorragendes Open-Source-Projekt namens Watchtower, das im Grunde selbst ein Docker-Container ist. Es überwacht die Registries aller Images, die auf deinem Docker-Daemon laufen. Wird ein Image in der Registry aktualisiert, lädt es das Image herunter und startet deinen Dienst einfach mit der alten Konfiguration neu. Genial, oder?

Watchtower in ein docker-compose-Projekt einbinden

Füge deiner Docker-Compose-Datei eine weitere Dienstkonfiguration für Watchtower hinzu.

docker-compose.yaml #L1-L7
1services:
2    watchtower:
3        restart: always
4        image: containrrr/watchtower
5        container_name: watchtower
6        volumes:
7            - /var/run/docker.sock:/var/run/docker.sock

Dadurch läuft Watchtower in seiner Standardkonfiguration, die alle Container im System überwacht. Es gibt viele Konfigurationsmöglichkeiten. Schau einfach in die Dokumentation[arch].

Weiterlesen