Docker-Images sind die Basis von Docker-Containern. Da Bilder die Grundlage bilden, haben Sie sich jemals gefragt, wie Sie Docker-Container aktualisieren können, wenn eine neue Version eines Bildes veröffentlicht wird?
Wundern Sie sich nicht mehr! In diesem Tutorial erfahren Sie, wie Sie Ihr lokales Docker-Image-Repository aktualisieren und Ihre Container auf eine neue Version aktualisieren, ohne die Dinge durcheinander zu bringen!
Voraussetzungen
Dieses Tutorial wird eine praktische Demonstration sein. Wenn Sie mitmachen möchten, stellen Sie sicher, dass Sie Folgendes haben:
- Linux-Umgebung – Das Tutorial verwendet Linux (Ubuntu Focal), um Docker auszuführen, aber Sie können die gleichen allgemeinen Schritte auch auf Windows oder macOS anwenden.
- Installieren Sie Docker-Engine 20.10.8 (Linux) oder Docker-Desktop 3.5.2 (macOS und Windows).
Idempotente Docker-Images ausführen
Ein Docker-Image enthält die gesamte Software, die zum Ausführen der zugehörigen Anwendung erforderlich ist, einschließlich Betriebssystempakete und Abhängigkeiten. Docker stellt Bilder durch Anweisungen in einer Datei namens Dockerfile zusammen , die idempotente Installationsanweisungen enthält.
Eine idempotente Anweisung impliziert, dass das Bild, das sich aus der Ausführung der Installationsanweisung ergibt, immer zu derselben Ausgabe führt.
Der Vorteil der Erstellung idempotenter Bilder besteht darin, dass sie systemunabhängig sind:Das resultierende Bild ist immer dasselbe. Auch die Containerausführung ist immer gleich, egal wo die Ausführung stattfindet.
Eine neue Image-Version impliziert normalerweise einige Verbesserungen an der Anleitung zum Erstellen der Docker-Container-Basis, zum Beispiel:
- Eine neuere Version des Quellcodes der Anwendung kann den alten ersetzen;
- Bessere Verwaltung von Abhängigkeiten:weniger Platzbedarf oder bessere Leistung;
- Bessere Sicherheit:Das Image verfügt über Sicherheitspatches, um Schwachstellen zu vermeiden.
Um die letzten Vorteile eines Updates in Docker-Images zu nutzen, müssen Sie wissen, wie Sie sie aktualisieren und diese Updates auf Ihre Container anwenden.
Lokale Docker-Images aktualisieren
Beginnen Sie damit, ein lokales Docker-Image zu aktualisieren. Die Anwendung im Beispiel python
Container führt Python-Code-Anwendungen aus. Das Aktualisieren des lokalen Docker-Image bedeutet, dass sich Anwendungen auf das neu aktualisierte Image verlassen können.
Zunächst müssen Sie wissen, welche Images derzeit in Ihrer lokalen Umgebung verfügbar sind. Führen Sie den folgenden Befehl aus, um Ihre lokalen Images zu überprüfen. Das TAG Spalte gibt die verfügbare Version des Bildes an.
docker images
Nachdem Sie nun Ihre lokale Version des Abbilds haben, müssen Sie das neueste verfügbare Abbild in einer Remoteregistrierung finden. Es gibt mehrere Remote-Docker-Registrierungen (Repositorys von Docker-Images), die die Docker-Engine abfragt, um Ihre lokalen Images zu aktualisieren. Docker ruft Bilder standardmäßig von DockerHub ab aber es gibt mehrere Alternativen, die meisten davon privat. Einige alternative Repositories sind unten aufgelistet.
- Öffentliche ECR-Galerie von Amazon Web Service (AWS)
- Nexus-Sonatyp
- VM-Hafen
Navigieren Sie durch die Repository-Seite und suchen Sie nach Ihrem gewünschten Image:ein offizielles Python-Image, das Sie als Beispiel aktualisieren werden. Geben Sie python ein , um das gewünschte Bild in DockerHub zu finden, und öffnen Sie es, um die verfügbaren Tags zu finden. Die Beispiele für dieses Tutorial stammen von einem Python-Image.
Jeder Tag hat auch ein Push-Datum. Das Push-Datum ist das Datum, an dem das Image in die Registrierung hochgeladen wurde. Beachten Sie das Tag des Bildes und Name , die Sie beide in den folgenden Schritten benötigen.
Nachdem Sie nun das Tag der neueren Version haben, ist es an der Zeit, das Image zu aktualisieren. Um auf ein neueres Image zu aktualisieren, müssen Sie zuerst die neue Version abrufen. Führen Sie den docker pull
aus Befehl gefolgt von einem Doppelpunkt und dem Namen und dem Tag des neueren Bildes:der Name und das Tag, die Sie zuvor notiert haben. Name und Tag für das Beispiel sind python:slim-buster
. Der vollständige Befehl und die resultierende Ausgabe sind unten gezeigt.
docker pull python:slim-buster
Um das Image aus der nicht standardmäßigen Docker-Image-Registrierung (DockerHub) abzurufen, müssen Sie stattdessen den vollständigen Image-URI angeben. Zum Beispiel:zum Pullen von Python aus (AWS) ECR Public Gallery, führen Sie
dockerpull public.ecr.aws/bitnami/python:3.7
aus
Lernen, wie man Docker-Container aktualisiert
Nachdem Sie einen Container erstellt haben, kann sich das Container-Image nicht mehr ändern. Da sich das Image nicht ändern kann, können Sie einen laufenden Container nicht wirklich aktualisieren. Was Sie tun, ist, alle laufenden Container mit Ersatzcontainern unter Verwendung der neueren Image-Version neu zu erstellen.
Da Sie bereits die neuere Version haben, ist es an der Zeit, die Container mit den alten Images, die aktualisiert werden müssen, neu zu erstellen.
Um herauszufinden, welche Container Sie neu erstellen müssen, listen Sie alle vorhandenen Container auf, auf denen das alte Image ausgeführt wird. Das docker ps
Befehl listet Container auf. Mit dem --filter
-Flag geben Sie an, welche Container aufgelistet werden sollen. Es gibt mehrere verfügbare Optionen zum Filtern und den ancestor
flag filtert nach dem Image, das als Basis zum Erstellen des Containers verwendet wird. Die Ausgangscontainer in den Beispielen sind für Python 3.7.2, das Sie als Filter anwenden. Das -a
Schalter zeigt alle verfügbaren Container.
docker ps -a --filter "ancestor=python:3.7.2"
Sie können die Ausgabe von docker ps
verwenden als Eingabe zum Ausführen des docker stop
Befehl für alle aufgelisteten Container. Das Flag -q
enthalten ist, sodass der Befehl „listing“ nur die IDs der Container zurückgibt. Die Ausgabe des Befehls ist die Liste der IDs der gestoppten Container.
docker stop $(docker ps -aq --filter "ancestor=python:3.7.2")
Nachdem Sie die Container gestoppt haben, müssen Sie Docker bitten, sie effektiv aus dem System zu löschen, bevor Sie das veraltete Image entfernen.
docker rm $(docker ps -aq --filter "ancestor=python:3.7.2")
Nachdem Sie alle mit dem veralteten Image verknüpften Container entfernt haben, können Sie das alte Image mit docker rmi
entfernen Befehl.
docker rmi python:3.7.2
Neue Container mit den Update-Images erstellen
Jetzt ist es an der Zeit, die alten Container, die zuvor gelöscht wurden, endlich durch neue Container auf Basis des aktualisierten Images zu ersetzen. Dieses Mal erstellen Sie die Container mit der neueren Image-Version. Da die Container idempotent sind, können Sie davon ausgehen, dass alles wie zuvor funktioniert.
Führen Sie den neuen Container mit docker run
aus Befehl und den Namen und das Tag des aktualisierten Images, das der Container benötigt. In diesem Beispiel das -it
Flag weist Docker an, den Container im interaktiven Modus auszuführen, sodass Sie Befehle innerhalb des Containers ausführen können, um aktualisierte Funktionen zu überprüfen.
docker run -it python:slim-buster
Beachten Sie, dass der neue Docker-Container eine neuere Python-Version ausführt:Version 3.9.7.
Schlussfolgerung
In diesem Tutorial haben Sie einen Blick hinter die Kulissen geworfen und die Magie hinter der Aktualisierung von Docker-Containern kennengelernt:Nebel und Spiegel! Es findet keine Aktualisierung statt! Entfernen Sie stattdessen alle Spuren der alten Version und ersetzen Sie sie durch neue Container mit einer neueren Version. Und dank Idempotenz funktionieren Container wie gewohnt weiter:TA-DA!
Also, was sind die Container, die Sie als nächstes aktualisieren möchten?