{"id":8907,"date":"2022-06-16T15:09:23","date_gmt":"2022-06-16T13:09:23","guid":{"rendered":"https:\/\/u-labs.de\/portal\/?p=8907"},"modified":"2023-08-01T00:04:26","modified_gmt":"2023-07-31T22:04:26","slug":"docker-container-automatisch-mit-watchtower-aktualisieren-alles-was-du-zu-haendischen-manuellen-updates-von-docker-containern-images-wissen-solltest","status":"publish","type":"post","link":"https:\/\/u-labs.de\/portal\/docker-container-automatisch-mit-watchtower-aktualisieren-alles-was-du-zu-haendischen-manuellen-updates-von-docker-containern-images-wissen-solltest\/","title":{"rendered":"Docker Container automatisch mit Watchtower aktualisieren: Alles was du zu manuellen &#038; automatischen Updates von Docker-Containern\/Images wissen solltest"},"content":{"rendered":"<p><a href=\"https:\/\/www.parasoft.com\/blog\/security-risks-data-exposure-the-owasp-top-10-for-2021\/\" title=\"Veraltete Softwarekomponenten finden sich auch 2021 unter den Top 10 der Einfallstore f\u00fcr Angriffe\" target=\"_blank\" rel=\"nofollow\">Veraltete Softwarekomponenten finden sich auch 2021 unter den Top 10 der Einfallstore f\u00fcr Angriffe<\/a>. Wer Software betreibt, sollte sie regelm\u00e4\u00dfig auf den aktuellen Stand bringen. Vor allem f\u00fcr Anwendungen die im Internet erreichbar sind, ist das sehr wichtig, damit Sicherheitsl\u00fccken schnell geschlossen werden. Das gilt grunds\u00e4tzlich &#8211; unabh\u00e4ngig davon, ob man einen Raspberry Pi Zuhause oder einen Server in der Cloud verwendet. Doch gerade bei Docker gibt es keine automatischen Updates. Wie man Docker-Container aktualisiert und welche wichtigen Besonderheiten es dort zu beachten gibt, zeigt dieser Beitrag. Daf\u00fcr werfen wir einen Blick auf die Grundlagen der Semantischen Versionierung und wie sie uns vor allem f\u00fcr automatische Aktualisierungen helfen kann.<\/p>\n<h2 class=\"wp-block-heading\">Das Problem: Der Lebenszyklus von Docker<\/h2>\n<p>Wenn ihr einen Container zum ersten Mal startet und das Image nicht auf eurem Pi oder Server liegt, l\u00e4dt Docker das Image herunter. Aber: Docker pr\u00fcft danach nie wieder auf Aktualisierungen! Dies geschieht nur, wenn ihr h\u00e4ndisch einen Pull durchf\u00fchrt. Das im Container laufende Programm wird daher schnell veralten und kann ein Sicherheitsrisiko darstellen.<\/p>\n<h2 class=\"wp-block-heading\">Die Docker Images<\/h2>\n<p>Ein Image setzt sich aus der Registry zusammen, dem Name eines Image und dem Tag. Die Registry ist optional, standardm\u00e4\u00dfig wird vom Docker-Hub ausgegangen. Auch der Tag muss nicht zwingend angegeben werden. Der Standard lautet hier &#8222;latest&#8220;, diesen speziellen Tag schauen wir uns sp\u00e4ter noch ein. Ein einfaches Beispiel ist der Webserver Nginx, <a href=\"https:\/\/hub.docker.com\/_\/nginx\" title=\"hier existiert ein gleichnamiges Image im Hub von Docker\" target=\"_blank\" rel=\"nofollow\">hier existiert ein gleichnamiges Image im Hub von Docker<\/a>.<\/p>\n<h2 class=\"wp-block-heading\">Was sind &#8222;Aliase&#8220;?<\/h2>\n<p>Alle verf\u00fcgbaren Tags werden <a href=\"https:\/\/hub.docker.com\/_\/nginx?tab=tags\" title=\"im Reiter &quot;Tags&quot;\" target=\"_blank\" rel=\"nofollow\">im Reiter &#8222;Tags&#8220;<\/a> aufgelistet. \u00dcbersichtlicher ist aber meist die Liste in der Beschreibung, die von vielen Images angeboten wird. Hier sieht man sofort, dass es Aliase gibt &#8211; also verschiedene Tags f\u00fcr das gleiche Image, die in einer Zeile dargestellt werden. Im markierten Bereich k\u00f6nnen wir wahlweise <strong>stable<\/strong>, <strong>1.20<\/strong> oder <strong>1.20.2<\/strong> nutzen und erhalten das gleiche Image. Name des Image und Tag trennt man per Doppelpunkt, etwa <strong>nginx:1.20.2<\/strong> um Version 1.20.2 von Nginx zu erhalten.<\/p>\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full\"><a href=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/05\/grafik.png\"><img loading=\"lazy\" decoding=\"async\" width=\"692\" height=\"387\" src=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/05\/grafik.png\" alt=\"\" class=\"wp-image-8909\" srcset=\"https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/05\/grafik.png 692w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/05\/grafik-300x168.png 300w, https:\/\/u-labs.de\/portal\/wp-content\/uploads\/2022\/05\/grafik-70x39.png 70w\" sizes=\"auto, (max-width: 692px) 100vw, 692px\" \/><\/a><\/figure>\n<\/div>\n<p>Durch die Aliase kann man Aktualisierungen leichter einspielen: Entscheiden wir uns beispielsweise f\u00fcr den exakten Tag <strong>1.20.2<\/strong>, m\u00fcssen wir bei einer neueren Version (z.B. <strong>1.20.3<\/strong>) den Tag von Hand \u00e4ndern. 1.20.2 wird die neue Version nicht erhalten &#8211; denn ein gro\u00dfer Vorteil in der Entwicklung mit Docker ist ja die Reproduzierbarkeit: <strong>nginx:1.20.2<\/strong> soll sich \u00fcberall gleich Verhalten.<\/p>\n<h2 class=\"wp-block-heading\">Wie kann ich mir die semantische Versionierung zunutze machen?<\/h2>\n<p>Vor allem kleinere Aktualisierungen m\u00f6chte man in der Praxis aber oft gerne automatisch einspielen. Zumindest wenn man die Software nur nutzt, statt aktiv an ihr zu entwickeln. Hier bieten sich Tags an, die nur einen Teil der Version enthalten: <strong>1.20<\/strong> wird beispielsweise automatisch alle Aktualisierungen der letzten Versionsnummer enthalten. Derzeit <strong>1.20.2<\/strong>, zuk\u00fcnftig aber auch <strong>1.20.3, 1.20.4<\/strong> und so weiter. <\/p>\n<p>Hier kann man sich die sogenannte <a href=\"https:\/\/semver.org\/lang\/de\/\" title=\"semantische Versionierung\" target=\"_blank\" rel=\"nofollow\">semantische Versionierung<\/a> zunutze machen, vorausgesetzt die Software nutzt diese: Bei <strong>1.20.2<\/strong> ist <strong>1<\/strong> die Hauptversion, sie wird bei gr\u00f6\u00dferen \u00c4nderungen erh\u00f6ht, die evtl. nicht abw\u00e4rtskompatibel sind. Die Nebenversionsnummer <strong>.20<\/strong> steht f\u00fcr neue Funktionen, die bereits vorhandene nicht einschr\u00e4nken sollten. Dagegen ist die Revisionsnummer (<strong>.2<\/strong>) f\u00fcr korrigierte Fehler oder Sicherheitsaktualisierungen vorgesehen. Teils gibt es auch noch Buildnummern. Das ist eine fortlaufende Zahl, die bei jedem kompilieren erh\u00f6ht wird und meist mit Minus von der restlichen Version getrennt. Sie ist aber eher f\u00fcr Test- und Entwicklerversionen.<\/p>\n<p>Der Tag <strong>1.20<\/strong> erh\u00e4lt also alle Fehlerkorrekturen. Weniger restriktiv k\u00f6nnte man auch den Tag <strong>1<\/strong> nutzen, um zus\u00e4tzlich neue Funktionen zu erhalten. Dies w\u00fcrde ich aber nur mit Bedacht empfehlen. Zumal man nicht sicher gehen kann, dass jede Versionsangabe den semantischen Regeln folgt. <\/p>\n<h2 class=\"wp-block-heading\">Lebenszyklus: Wann und Wie wird ein Docker-Container aktualisiert?<\/h2>\n<p>Wichtig ist, den Lebenszyklus zu verstehen: Beim ersten Start eines Containers l\u00e4dt Docker das per Tag angegebene Image einmalig aus dem Internet. Danach findet <strong>keine <\/strong>automatische Aktualisierung statt! Wenn ihr etwa den Tag <strong>nginx:1.20<\/strong> nutzt, derzeit ist <strong>1.20.2<\/strong> die aktuellste Version und morgen erscheint 1.<strong>20.3<\/strong>, werdet ihr die neue Version also nie erhalten. Hierf\u00fcr sind zwei Schritte n\u00f6tig:<\/p>\n<ol class=\"wp-block-list\">\n<li>Das jeweilige Image neu <em>pullen<\/em>, dadurch wird die aktuellste Version aus der Docker Registry geladen &#8211; z.B. <em>docker pull nginx:1.20<\/em><\/li>\n<li>Den Container neu erstellen. Neu heruntergeladene Images werden auch nicht auf laufende Container angewendet! Neu erstellt werden kann ein Container z.B. mit <em>docker compose up -d<\/em>.<\/li>\n<\/ol>\n<h2 class=\"wp-block-heading\">Wie kann ich meine per Docker bereitgestellten Anwendungen automatisch aktualisieren?<\/h2>\n<p>Beide Schritte m\u00fcssen allerdings h\u00e4ndisch ausgef\u00fchrt werden. Gerade um Sicherheitsl\u00fccken schnell zu schlie\u00dfen, m\u00f6chte man zumindest Fehlerkorrekturen m\u00f6glichst automatisiert einspielen. Man k\u00f6nnte daf\u00fcr einen entsprechenden Tag verwenden (im Beispiel etwa <strong>nginx:1.20<\/strong>), per Skript automatisch nach neuen Images pullen und den Container neu starten. Mit dem Projekt Watchtower gibt es jedoch bereits eine fertige L\u00f6sung, die genau das macht. Ein Watchtower-Container \u00fcberwacht eure laufenden Docker-Container, pr\u00fcft regelm\u00e4\u00dfig auf aktualisierte Image und startet in diesem Falle nicht nur den betroffenen Container neu. Er kann auch Abh\u00e4ngigkeiten ber\u00fccksichtigen, wenn z.B. der zu aktualisierende Nginx Webserver zu einer PHP-FPM Installation geh\u00f6rt. Oder Datenbanken f\u00fcr eine Anwendung im Spiel sind.<\/p>\n<p>Dazu legt ihr in einem frei w\u00e4hlbaren Verzeichnis eine <strong>docker-compose.yml<\/strong> an:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-yaml\" data-line=\"\">services:\n  watchtower:\n    image: containrrr\/watchtower:1.4.0\n    container_name: watchtower\n    mem_limit: 128MB\n    restart: always\n    # Prueft alle 4h nach neuen Images\n    command: --interval 21600\n\n    volumes:\n      - \/var\/run\/docker.sock:\/var\/run\/docker.sock\n    environment:\n      - &quot;TZ=Europe\/Berlin&quot;<\/code><\/pre>\n<p>Startet den Container mit <strong>docker compose up -d<\/strong> im Hintergrund. In den Logs seht ihr, wie Watchtower konfiguriert ist und wann die n\u00e4chste Pr\u00fcfung durchgef\u00fchrt wird:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">watchtower  | time=&quot;2022-05-10T21:53:31+02:00&quot; level=info msg=&quot;Watchtower 1.4.0&quot;\nwatchtower  | time=&quot;2022-05-10T21:53:31+02:00&quot; level=info msg=&quot;Using no notifications&quot;\nwatchtower  | time=&quot;2022-05-10T21:53:31+02:00&quot; level=info msg=&quot;Checking all containers (except explicitly disabled with label)&quot;\nwatchtower  | time=&quot;2022-05-10T21:53:31+02:00&quot; level=info msg=&quot;Scheduling first run: 2022-05-11 03:53:31 +0200 CEST&quot;\nwatchtower  | time=&quot;2022-05-10T21:53:31+02:00&quot; level=info msg=&quot;Note that the first check will be performed in 5 hours, 59 minutes, 59 seconds&quot;<\/code><\/pre>\n<p>Wird ein neues Image erkannt, protokolliert Watchtower dies und startet die betroffenen Container entsprechend neu:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">time=&quot;2022-02-25T21:36:27+01:00&quot; level=info msg=&quot;Found new mariadb:latest image (539871f8c20e)&quot;<\/code><\/pre>\n<p>Damit habt ihr f\u00fcr viele F\u00e4lle eine L\u00f6sung, die sich automatisch um kleinere Aktualisierungen k\u00fcmmert. Was ihr allerdings regelm\u00e4\u00dfig per Hand pr\u00fcfen solltet, sind Updates der Nebenversion oder &#8211; je nach Tag &#8211; zumindest die Hauptversion. <\/p>\n<h2 class=\"wp-block-heading\">Sonderfall #1: &#8222;latest&#8220; Tag<\/h2>\n<p>Wenn man keinen Tag angibt (z.B. nur <strong>nginx <\/strong>statt <strong>nginx:1.20<\/strong>), setzt Docker standardm\u00e4\u00dfig &#8222;latest&#8220;. Dieser Tag steht oft f\u00fcr die aktuellste, stabile Version. Allerdings nur per Konvention &#8211; man kann daher nicht davon ausgehen, dass er f\u00fcr alle Images existiert! Generell w\u00fcrde ich den &#8222;latest&#8220; Tag meiden: Da er keinerlei R\u00fccksicht auf m\u00f6gliche Inkompatibilit\u00e4ten nimmt, kann es zu Problemen kommen. Das gilt ebenfalls f\u00fcr Tags, die zwar anders hei\u00dfen, aber einen \u00e4hnlichen Zweck erf\u00fcllen &#8211; etwa &#8222;stable&#8220; im Falle von Nginx. <\/p>\n<p>Schlussendlich k\u00f6nnen solche Tags auch einen der Vorteile von Docker zunichte machen, n\u00e4mlich die Konsistenz und Reproduzierbarkeit. Daf\u00fcr w\u00e4re eine exakte Version am besten geeignet. Mit Tags wie <em>latest<\/em> steigt die Wahrscheinlichkeit mit zunehmendem Alter, dass sich ein so erzeugter Container auf einem anderen System auch anders verh\u00e4lt.<\/p>\n<p>Ich w\u00fcrde mindestens eine Hauptversion als Tag angeben, sofern m\u00f6glich. Besser sind Haupt- und Nebenversion. Wobei dies nur eine Faustformel ist. Man sollte sich die Art der Versionierung des jeweiligen Programms anschauen und sich entsprechend entscheiden. Manche Projekte halten sich nicht an die semantische Versionierung, sodass z.B. auch Nebenversionen m\u00f6glicherweise inkompatibel mit vorherigen Versionen sind.<\/p>\n<p>In seltenen F\u00e4llen wird leider gar keine oder nur eine sehr rudiment\u00e4re Auswahl an Tags angeboten. In diesem Falle kann man Watchtower anweisen, nur auf neue Images zu pr\u00fcfen, ohne automatische Aktualisierungen durchzuf\u00fchren:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-yaml\" data-line=\"\">com.centurylinklabs.watchtower.monitor-only=true<\/code><\/pre>\n<p>Damit man von den Aktualisierungen erf\u00e4hrt, <a href=\"https:\/\/containrrr.dev\/watchtower\/notifications\/\" title=\"m\u00fcssen Benachrichtigungen eingerichtet werden\" target=\"_blank\" rel=\"nofollow\">m\u00fcssen Benachrichtigungen eingerichtet werden<\/a>. Ansonsten bleibt nur das unbequemere regelm\u00e4\u00dfige Pr\u00fcfen bzw. Filtern der Protokolle. Hier sollte aber klar sein, dass diese Variante weniger Wartungsfreundlich ist &#8211; und man regelm\u00e4\u00dfig von Hand auf Aktualisierungen pr\u00fcfen sollte, damit die Software nicht veraltet.<\/p>\n<h2 class=\"wp-block-heading\">Sonderfall #2: Selbst gebaute Images<\/h2>\n<p>Der per Watchtower gezeigte Weg funktioniert nur, wenn der Container direkt mit einem Image aus dem Docker-Hub gestartet wird. Selbst gebaute Images per Dockerfile finden keine Ber\u00fccksichtigung. Hierf\u00fcr m\u00fcsste das Basis-Image gepullt und das selbst erstellte Image neu gebaut werden. Die Vernk\u00fcpfung zum Dockerfile fehlt Watchtower, weswegen er das selbst gebaute Image f\u00e4lschlicherweise im Docker-Hub sucht und dort nat\u00fcrlich nicht findet:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">time=&quot;2022-05-10T03:39:59+02:00&quot; level=warning msg=&quot;Reason: registry responded to head request with \\&quot;401 Unauthorized\\&quot;, auth: \\&quot;Bearer realm=\\\\\\&quot;https:\/\/auth.docker.io\/token\\\\\\&quot;,service=\\\\\\&quot;registry.docker.io\\\\\\&quot;,scope=\\\\\\&quot;repository:library\/u-img_u-img_php:pull\\\\\\&quot;,error=\\\\\\&quot;insufficient_scope\\\\\\&quot;\\&quot;&quot; container=\/u-img_php image=&quot;u-img_u-img_php:latest&quot;<\/code><\/pre>\n<p>Hier muss man die regelm\u00e4\u00dfige Neu-Erstellung des eigenen Images automatisieren. Im technisch besten Falle kommt eine CI\/CD Pipeline zum Einsatz, die z.B. als n\u00e4chtliche Aufgabe (Nightly Build) automatisch das Image neu baut. Einsteiger k\u00f6nnen sich aber auch mit zwei Zeilen in einem Skript behelfen (jeweils im Verzeichnis ausgef\u00fchrt, in dem das Dockerfile liegt):<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">docker pull $(egrep ^FROM Dockerfile | awk &#039;{print $2}&#039;)\ndocker compose up -d<\/code><\/pre>\n<p>Der erste Befehl lie\u00dft Image + Tag aus dem Dockerfile aus und pullt das Image. Falls es hier Neuerungen gibt, erscheint <em>Downloaded newer image for xx<\/em> in der Ausgabe, ansonsten <em>Image is up to date for xx<\/em>. Docker Compose ist mittlerweile so intelligent, dass <em>up<\/em> nur Container neu startet, bei denen sich etwas in der Konfiguration &#8211; wie unter anderem das Image &#8211; ge\u00e4ndert hat. <\/p>\n<p>Zus\u00e4tzlich w\u00fcrde ich Watchtower \u00fcber folgendes Label f\u00fcr einen Container der selbst gebaute Images nutzt komplett deaktivieren. Funktionell ist das zwar nicht n\u00f6tig. Aber es vermeidet die oben gezeigten &#8222;falsche Fehler&#8220;, wenn Watchtower vergeblich versucht, das Image in der Docker-Registry zu finden:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-yaml\" data-line=\"\">com.centurylinklabs.watchtower.enable=false<\/code><\/pre>\n<p>Au\u00dferdem hat Docker vor einiger Zeit Limitierungen f\u00fcr Nutzer eingef\u00fchrt, die kein kostenpflichtiges Abo besitzen. Vor allem mit einer gr\u00f6\u00dferen Anzahl an Container sollte es daher auch im eigenen Sinne sein, unn\u00f6tige Anfragen m\u00f6glichst zu vermeiden.<\/p>\n<p>Hinweis: Beachtet bei einer automatischen Ausf\u00fchrung per Cron, dass dort i.d.R. kein vollst\u00e4ndiger $PATH zur Verf\u00fcgung steht! Pr\u00fcft daher mit <strong>which docker<\/strong>, wo eure Binary liegt (meist \/usr\/bin\/docker) und gebt den vollst\u00e4ndigen Pfad im Skript an, etwa so:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">\/usr\/bin\/docker compose up -d<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Letzte aktualisierte Container anzeigen (MOTD beim Login)<\/h2>\n<p>Je nachdem welche und wie viele Container man nutzt, f\u00fchrt Watchtower in einigen Tagen bis Wochen die ersten Aktualisierungen durch. In den Protokollen des Containers wird dies mit <em>Found new XYZ image<\/em> vermerkt:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">docker logs watchtower --tail all 2&gt;&amp;1 | grep &quot;Found new&quot;<\/code><\/pre>\n<p>Praktisch finde ich, wenn man beim Einloggen auf dem Server die zuletzt aktualisierten Images aufgelistet bekommt. Das kann mit der <em>Message of the Day<\/em> umgesetzt werden: Sie f\u00fchrt bestimmte Shellskripte nach der Anmeldung aus und zeigt deren Ausgabe an. Sie liegen unter Ubuntu im Ordner <strong>\/etc\/update-motd.d<\/strong> und werden nach dem Name sortiert ausgef\u00fchrt. Daher gibt es ein zweistelliges Pr\u00e4fix, um die Reihenfolge unabh\u00e4ngig vom alphabetischen Name definieren zu k\u00f6nnen. Im Beispiel lege ich <strong>30-docker-container-updates<\/strong> an:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">sudo vim \/etc\/update-motd.d\/30-docker-container-updates<\/code><\/pre>\n<p>Hierbei handelt es sich um ein normales Shell-Skript, in diesem Fall Bash. Es filtert wie oben gezeigt die neu heruntergeladenen Images und entfernt unn\u00f6tige Inhalte, sodass uns nur Zeitstempel und Image angezeigt werden:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">#!\/bin\/bash\nprintf &quot;Letzte Container-Updates\\n&quot;\ndocker logs watchtower --tail all 2&gt;&amp;1 | grep &quot;Found new&quot; |\n        gawk &#039;match($0, \/time=&quot;([^&quot;]+)&quot; level=info msg=&quot;Found new (.*) image \\((.*)\\)\/, a) {print &quot;[&quot; a[1] &quot;] &quot; Image a[2] &quot; (&quot; a[3] &quot;)&quot;}&#039; |\n        tail -10\nprintf &quot;\\n&quot;<\/code><\/pre>\n<p>Skript ausf\u00fchrbar machen:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">\/etc\/update-motd.d\/30-docker-container-updates<\/code><\/pre>\n<p>Ergebnis bei der n\u00e4chsten Anmeldung:<\/p>\n<pre class=\"wp-block-prismatic-blocks\"><code class=\"language-bash\" data-line=\"\">Letzte Container-Updates\n[2022-05-18T03:53:37+02:00] nginx:1.21-alpine (b1c3acb28882)\n[2022-05-24T01:08:10+02:00] mariadb:10.7 (fb8f6c175bee)\n[2022-05-25T00:13:47+02:00] traefik:v2.6 (22c6901de2be)\n[2022-06-07T06:18:10+02:00] mariadb:10.7 (7e5b7dee917c)<\/code><\/pre>\n<h2 class=\"wp-block-heading\">Fazit<\/h2>\n<p>Gerade weil Docker keinerlei automatische Aktualisierungen vorsieht, ist es um so wichtiger, dass man diese Prozesse kennt und entsprechend selbst f\u00fcr Aktualisierungen sorgt. Watchtower kann einem hier viel Arbeit abnehmen, in dem ein Gro\u00dfteil (oder sogar alle, je nach verwendeter Software) aller Images zusammen mit den dazugeh\u00f6rigen Containern automatisiert aktualisiert werden.<\/p>\n<p>Wer vorsichtiger agieren m\u00f6chte, kann auch auf automatische Aktualisierungen verzichten und sich auf verschiedenen Wegen informieren lassen. <\/p>\n<p>Man darf aber nicht vergessen: Watchtower ist ein Hilfsmittel. Es ersetzt <strong>nicht<\/strong>, dass ihr euch mit neuen Nebenversionen (oder zumindest Hauptversionen) sowie deren \u00c4nderungen auseinander setzt &#8211; und im Falle von nicht abw\u00e4rtskompatiblen Ver\u00e4nderungen eure Konfiguration entsprechend anpasst. Bei vielen Programmen ist das aber eher selten, sodass sich trotzdem viel Arbeit einsparen l\u00e4sst. Auf der anderen Seite werden Aktualisierungen schnell eingespielt, was sicherheitstechnisch definitiv sinnvoll ist.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Veraltete Softwarekomponenten finden sich auch 2021 unter den Top 10 der Einfallstore f\u00fcr Angriffe. Wer Software betreibt, sollte sie regelm\u00e4\u00dfig auf den aktuellen Stand bringen. Vor allem f\u00fcr Anwendungen die im Internet erreichbar sind, ist das sehr wichtig, damit Sicherheitsl\u00fccken schnell geschlossen werden. Das gilt grunds\u00e4tzlich &#8211; unabh\u00e4ngig davon, ob man einen Raspberry Pi Zuhause &#8230;<\/p>\n","protected":false},"author":5,"featured_media":9108,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[671],"tags":[912,497,387,870],"class_list":["post-8907","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-raspberry-pi","tag-container","tag-docker","tag-update","tag-updates"],"_links":{"self":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8907","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/comments?post=8907"}],"version-history":[{"count":8,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8907\/revisions"}],"predecessor-version":[{"id":10805,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/posts\/8907\/revisions\/10805"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media\/9108"}],"wp:attachment":[{"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/media?parent=8907"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/categories?post=8907"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/u-labs.de\/portal\/wp-json\/wp\/v2\/tags?post=8907"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}