Docker Container automatisch aktualisieren

Wenn man Docker Container auf seinem Server betreibt, möchte man
natürlich, dass diese auch immer auf dem neusten Stand sind. Das dient
auch zur Server- und Datensicherheit bei. Um sicherzugehen, dass man
keine Updates verpasst, sollte man alle paar Tage die Container überprüfen. Das kann lästig werden und irgendwann schläft das Thema bei einem ein.

Watchtower hilft und so richtet ihr es ein

Dieses Problem habe ich mit Watchtower erfolgreich gelöst. Nach der Installation werden alle Container in regelmäßigen Abständen auf Updates kontrolliert.
Wie ich das gemacht habe? Ich erzähle es Euch.

Und so geht es…

Container im Hafen. Hier symbolisch für Linux Docker Container

Das Setup

Zuerst sollte man sich mit dem eigenen Server verbinden und zum Root-User bzw. zu dem User unter dem Docker Service läuft, wechseln.
Einfach halber hier mit dem Root-User.

Danach begibt man sich auf die Github Seite und liest sich mal die README durch.

Auf dem Server erstellt man in einem eindeutigen Verzeichnis, wo man die Datei auch wieder findet, eine Docker-compose.yml Datei, sofern noch nicht vorhanden und fügt folgendes ein:
vi docker.compose.yml

selektive Containerauswahl:

version: '2.2'
services:

  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /root/.docker/config.json:/config.json
    command: watchtower openvpn-as nextcloud Aria2 collabora onlyoffice openvpn  wordpress_wordpress_1 wordpress_mariadb_1 matomo_application_1 matomo_mariadb_1  bitward_bitwarden_1 --schedule '0 0 0 * * *'  --cleanup --debug
    environment:
      - TZ='Europe/Berlin'
     #- REPO_USER='githubuser'
     #- REPO_PASS='password'
     #- WATCHTOWER_NOTIFICATIONS=email
     #- WATCHTOWER_NOTIFICATION_EMAIL_FROM=server@Domain.tld
     #- WATCHTOWER_NOTIFICATION_EMAIL_TO=mail@domain.tld
     #- WATCHTOWER_NOTIFICATION_EMAIL_SERVER=mail.domain.tld
     #- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=mail@domain.tld
     #- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=Secret
    restart: always

selektiv Container aktualisieren

 command: <containerid> <containerid2> --interval 30

Dieser Code sorgt dafür, dass die Überprüfung alle 30 Minuten ausgeführt wird. In unserem Beispiel werden die Container mit dem Namen Watchtower, Pihole, Office, Firefox-syncserver und aria2c überprüft und bei Bedarf aktualisiert.
Kleine Anmerkung:

Watchtower aktualisiert generell alle Container, die laufen. Nur wenn man ,wie ich, selektiv aktualisieren möchte, werden die Containernamen eingetragen.

Zeitpunkt zum aktualisieren setzen

Wenn man nicht tagsüber die Container aktualisierten lassen möchte, kann man dies auch auf die gewünschte Zeit verschieben.

--schedule '0 0 0 * * *'  --cleanup --debug 

Mit dieser Anweisung wird das überprüfen und das eventuelle aktualisieren auf die Nacht verschoben und die alten Images anschließend gelöscht. Mit debug erhalte ich eine genauere Logausgabe.

Email-Benachrichtigung

Ganz gut zum debuggen ist das senden einer Email wenn ein Container aktualisiert wurde. Dies geschieht mit folgendem Eintrag. Ich habe aber eine Raute davor gesetzt, da aktuell alles läuft wie gewünscht. So läuft alles stillschweigend nachts ab und werde nicht genervt mit Emails. ?

 - WATCHTOWER_NOTIFICATIONS=email
     #- WATCHTOWER_NOTIFICATION_EMAIL_FROM=server@Domain.tld
     #- WATCHTOWER_NOTIFICATION_EMAIL_TO=mail@domain.tld
     #- WATCHTOWER_NOTIFICATION_EMAIL_SERVER=mail.domain.tld
     #- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_USER=mail@domain.tld
     #- WATCHTOWER_NOTIFICATION_EMAIL_SERVER_PASSWORD=Secret

Container starten

Hat man den Block nun für sich angepasst, speichert man die docker-compose.yml Datei ab und führt diese aus.

docker-compose up -d

Der Container sollte nun starten. Sobald die ersten Updates durchgelaufen sind, schaut man in die Log Datei des Watchtower Containers. sudo Docker Logs <watchtowerid> Die Ausgabe sollte ungefähr so aussehen:

[...]
time="2018-09-16T14:57:50Z" level=info msg="Found new crazymax/firefox-syncserver:latest image (sha256:ca246670c21f134a6f3fbb360da0158f0e78a24f07e8aa6ed645f2b2e5465e4c)"
time="2018-09-16T14:57:51Z" level=info msg="Stopping /firefox-syncserver (2e6fd27c9978f16852444e9ece1015c5b5c68ce74e922dea8a9f53760d0cb8b4) with SIGTERM"
time="2018-09-16T14:58:05Z" level=info msg="Creating /firefox-syncserver"
time="2018-09-21T19:42:55Z" level=info msg="Unable to update container /aria2c, err='Error response from daemon: Get https://registry-1.docker.io/v2/abcminiuser/docker-aria2-with-webui/manifests/latest-ng: Get https://auth.docker.io/token?scope=repository%3Aabcminiuser%2Fdocker-aria2-with-webui%3Apull&service=registry.docker.io: net/http: TLS handshake timeout'. Proceeding to next."
time="2018-09-22T18:00:10Z" level=info msg="Waiting for running update to be finished..."
time="2018-09-22T18:07:55Z" level=info msg="First run: 2018-09-22 18:12:55 +0000 UTC"
time="2018-09-27T19:18:00Z" level=info msg="Found new crazymax/firefox-syncserver:latest image (sha256:7ee3b2546928be7c60372923530ce448afba447a7458acea077e6a08d667cf7d)"
time="2018-09-27T19:18:04Z" level=info msg="Stopping /firefox-syncserver (f3893fe0d3ee933d0dd40ebbfc4e201fd19d4f8c80310300770b7e06d02d6869) with SIGTERM"
time="2018-09-27T19:18:18Z" level=info msg="Creating /firefox-syncserver"
[...]

Ich hoffe ihr habt dieses kurze Tutorial verstanden, sollten Fragen auftauchen fragt mich einfach indem ihr einen Kommentar unter diesen Artikel schreibt. Ihr könnt natürlich auch schreiben wenn die Anleitung funkioniert hat. ?