So aktualisieren Sie Docker-Container zum Anwenden von Image-Updates

0
856

Docker-Container sind als Einwegartikel gedacht und können leicht ausgetauscht werden. Wenn eine neue Version des Basis-Images eines Containers veröffentlicht wird, sollten Sie das neue Image abrufen und eine neue Containerinstanz starten. So verwalten Sie Image-Updates in Ihrer Containerflotte.

Pulling New Images

Die grundlegende Methode zum Anwenden eines Image-Updates ist um das neue Image abzurufen, laufende Container basierend auf der alten Version zu zerstören und dann neue Container an ihrer Stelle zu starten.

Hier ein Beispiel für einen Container, der das nginx:latest image verwendet:

# Neues Image ziehen docker pull nginx:latest # Alten Container nach Namen löschen docker rm example-nginx # Neuen Container Docker starten run -d -p 80:80 –name example-nginx nginx:latest

Docker hat kein eingebautes -in-Weg, um Image-Updates zu erkennen und Ihre laufenden Container zu ersetzen. Das Ergebnis ist ein komplizierter manueller Austauschprozess. Es kann vereinfacht werden, indem Sie Docker Compose verwenden, um Ihre Container anstelle des einfachen Docker-Run-Befehls zu starten.

Container mit Docker Compose ersetzen

< p>Mit Docker Compose können Sie mithilfe einer docker-compose.yml-Datei deklarative Darstellungen von Containerstapeln erstellen. Der Stack wird mit docker-compose up gestartet, wobei die in der Datei enthaltene Konfiguration verwendet wird. Dies ersetzt die lange Liste von Flags, die normalerweise an docker run übergeben werden.

Werbung

Docker Compose verfügt über einen integrierten Pull-Befehl, der aktualisierte Versionen aller Images in Ihrem Stack abruft. Es ist immer noch ein zweistufiges Verfahren, da Sie docker-compose anschließend manuell erneut ausführen müssen.

# Ziehen Sie alle Images in den Stapel docker-compose pull # Starten Sie den Stapel neu # Wenn eine neue Image-Version gezogen wurde, werden Container, die das alte Tag verwenden, durch neue Instanzen ersetzt. docker-compose up -d

Docker Compose bietet eine einfachere und einprägsamere Erfahrung, bei der Sie keine Bildnamen eingeben oder sich die Flags merken müssen, die Sie an docker run übergeben haben. Die beiden Befehle können leicht zu einem einzigen Shell-Alias ​​verkürzt werden:

alias composePullUp=”docker-compose pull && docker-compose up -d”

Image-Tags verwalten

Sie müssen auf das richtige Tag verweisen, wenn Sie Bilder manuell ziehen. Docker Compose übernimmt dies für Sie und wählt die Tags aus, die in Ihrer docker-compose.yml angegeben sind.

Das Ziehen der neuen Version eines Tags ist nicht unbedingt dasselbe wie die Verwendung der neuesten Version eines Images. Wenn Sie die neueste Softwareversion im Container verwenden möchten, beachten Sie die Tagging-Praktiken des Bildautors.

Wenn Sie beispielsweise eine neue Version von node:14 ziehen, erhalten Sie die neueste Patch-Version von Node.js 14. Das Ziehen von node:latest liefert die neueste Node.js-Version, derzeit 16. Wenn ein alter Container dieses Image verwendet hat , würde ein Pull-and-Replace-Prozess einen größeren Versionssprung für die Node-Binärdatei im Container auslösen.

Images neu erstellen

Bisher haben wir gesehen, wie mit Containern umgegangen wird, die mit Images gestartet wurden, die Sie direkt aus Docker Hub oder einer anderen Registrierung ziehen. Images, die Sie selbst erstellen, müssen neu erstellt werden, wenn sich ihr Basis-Image ändert.

Erstellen Sie zuerst das Image neu:

docker build –pull -t my-image:latest .

Ersetzen Sie dann Ihre Container:

# Löschen Sie den alten Container nach dem Namen docker rm my-container # Starten Sie einen neuen Container docker run -d –name my-container my-image:latest Werbung

Das an docker build übergebene Flag –pull weist Docker an, das in Ihrer Dockerfile referenzierte Basis-Image abzurufen. Ohne dieses Flag würde Docker die vorhandene Tag-Referenz wiederverwenden, wenn das Image bereits auf dem System vorhanden war.

Docker Compose-Benutzer können die gleichen Ergebnisse mit den entsprechenden docker-compose-Befehlen erzielen:

docker- compose build –pull docker-compose up -d

Compose bietet wieder einen einfacheren, wenn auch immer noch zweistufigen Prozess. Sie können bestimmte Image-Namen und -Tags vergessen und sich stattdessen darauf verlassen, dass Compose geänderte Basis-Images abruft, Ihre Ebenen darauf neu erstellt und dann Ihre Container neu erstellt.

Software in Containern

Manchmal kann es verlockend sein, Software in Ihren Containern manuell zu aktualisieren. Dies sollte vermieden werden, da es sich wieder um die Prinzipien von Docker handelt.

Ausführen von apt-get update && apt get upgrade -y nach einem Zeitplan (oder die Gegenstücke Ihres Paketmanagers) ist die Standardpraxis bei der Verwaltung eines Bare-Metal-Linux-Servers. Diese Befehle werden normalerweise nicht in einem Docker-Container ausgeführt, obwohl sie möglicherweise als Teil einer Docker-Datei enthalten sind, um die neuesten Sicherheitspatches während eines Image-Builds zu erhalten.

Das Basis-Image regelmäßig abrufen und neu erstellen Ihre Container ist die bevorzugte Methode, um sie auf dem neuesten Stand zu halten. Dadurch erhalten Sie alle vorgelagerten Sicherheitsfixes und verkürzt die Lebensdauer einzelner Container. Containerumgebungen dürfen nicht geändert werden, nachdem eine Instanz erstellt wurde. Dateisystemänderungen sollten auf Schreibvorgänge in temporäre Pfade und dedizierte Docker-Volumes beschränkt sein, die den Container überdauern.

Automatisieren von Container-Updates

Sie können die Überprüfung auf aktualisierte Image-Tags und den Neustart Ihrer Container mithilfe von Drittanbieterprojekten automatisieren. Watchtower ist eine beliebte Wahl, die laufende Container überwacht und sie ersetzt, wenn sich ihr Docker Hub-Image ändert.

Watchtower selbst wird als Container bereitgestellt:

docker run -d -v /var/run/docker .sock:/var/run/docker.sock containerrrr/watchtower Werbung

Jetzt haben Sie eine funktionierende Watchtower-Installation. Der Docker-Socket Ihres Hosts ist in den Watchtower-Container eingehängt, sodass er Docker-Befehle zum Erstellen und Löschen von Containern ausführen kann.

Watchtower erkennt automatisch neue Image-Releases auf Docker Hub und zieht sie auf Ihren Computer , und ersetzen Sie Container mit dem Image. Vorhandene Container werden heruntergefahren und an ihrer Stelle neue, identische erstellt. Dieselben Flags, die Sie Docker Run gegeben haben, werden an die Ersatzcontainer geliefert.

Watchtower funktioniert standardmäßig nur mit Docker Hub. Sie können es mit privaten Bildregistrierungen verwenden, indem Sie Anmeldeinformationen in einer Konfigurationsdatei angeben.

Erstellen Sie eine JSON-Datei mit folgendem Inhalt:

{ “auths”: { “example.com”: { ” auth”: “credentials” } } }

Ersetzen Sie example.com durch den Pfad zu Ihrer Registrierung.

Generieren Sie als Nächstes eine Zeichenfolge mit Anmeldeinformationen aus Ihrem Registrierungs-Benutzernamen und -Passwort:

echo -n ' Benutzername:Passwort' | base64

Fügen Sie die resultierende Base64-codierte Zeichenfolge in die Konfigurationsdatei ein und ersetzen Sie den Platzhaltertext für die Anmeldeinformationen.

Werbung

Mounten Sie die Konfigurationsdatei in Ihren Watchtower-Container, um den Zugriff auf Ihre Registrierung zu ermöglichen:

docker run -d -v config.json:/config.json -v /var/run/docker.sock:/var/run/docker.sock containerrr/watchtower

Schlussfolgerung

< p>Docker hat keinen Mechanismus, um Upstream-Image-Updates zu erkennen und auf Ihre laufenden Container anzuwenden. Sie können entweder Docker-CLI-Befehle nacheinander verwenden, docker-compose als Abstraktion auf höherer Ebene oder ein Drittanbieter-Tool wie Watchtower verwenden, um Ihre Container zu ersetzen, wenn neue Image-Versionen veröffentlicht werden.

Je nach Ihren Umständen , sehen Sie möglicherweise überhaupt keine Notwendigkeit, Container auf diese Weise zu aktualisieren. Wenn Ihr Team CI-Pipelines verwendet, um bei jedem Commit ein Docker-Image zu erstellen, produzieren und stellen Sie möglicherweise bereits mehrmals täglich aktualisierte Images bereit. Stellen Sie in diesem Fall sicher, dass Sie das Flag –pull mit Docker-Build verwenden, damit Upstream-Fixes in Ihren Bildern enthalten sind.