Einführung
In diesem Lab lernen Sie, wie Sie den Befehl docker container commit verwenden, um neue Docker-Images aus bestehenden Containern zu erstellen. Wir beginnen mit dem Starten und Modifizieren eines Containers, anschließend werden diese Änderungen in einem neuen Image festgehalten.
Sie werden außerdem untersuchen, wie Container-Änderungen mit neuen Konfigurationen übernommen werden können, einschließlich der Festlegung neuer CMD- und EXPOSE-Anweisungen. Dies demonstriert die Flexibilität bei der Erstellung benutzerdefinierter Images basierend auf laufenden Containern.
Container starten und modifizieren
In diesem Schritt lernen Sie, wie Sie einen Docker-Container starten und Änderungen darin vornehmen. Wir verwenden ein einfaches Ubuntu-Image, um den Prozess zu demonstrieren.
Zuerst laden wir das Ubuntu-Image herunter. Dieser Befehl lädt das Ubuntu-Image von Docker Hub auf Ihren lokalen Rechner.
docker pull ubuntu:latest
Sie sollten eine Ausgabe sehen, die anzeigt, dass das Image heruntergeladen wird. Sobald der Download abgeschlossen ist, können Sie einen Container basierend auf diesem Image ausführen.
Nun starten wir einen interaktiven Container mit dem Ubuntu-Image. Die Flags -it werden verwendet, um ein pseudo-TTY zuzuweisen und stdin offen zu halten, sodass Sie mit der Shell des Containers interagieren können. Das Flag --name weist dem Container einen Namen zu, was die spätere Referenzierung erleichtert.
docker run -it --name my-ubuntu ubuntu:latest /bin/bash
Nach Ausführung dieses Befehls befinden Sie sich in der Bash-Shell des Containers. Sie können dies überprüfen, indem Sie den Hostnamen abfragen, der der Container-ID entspricht.
Innerhalb des Containers erstellen wir eine einfache Datei. Wir verwenden den Befehl echo, um einen Text in eine Datei namens hello.txt im Root-Verzeichnis zu schreiben.
echo "Hello from inside the container!" > /hello.txt
Sie können überprüfen, ob die Datei erstellt wurde und den korrekten Inhalt enthält, indem Sie den cat-Befehl verwenden.
cat /hello.txt
Sie sollten die Ausgabe "Hello from inside the container!" sehen.
Nachdem wir eine Änderung im Container vorgenommen haben, verlassen wir die Shell des Containers.
exit
Sie befinden sich nun wieder im Terminal Ihres Host-Rechners. Der Container läuft weiterhin im Hintergrund. Sie können dies überprüfen, indem Sie die laufenden Container auflisten.
docker ps
Sie sollten den Container my-ubuntu in der Liste sehen.
Container-Änderungen in neues Image übernehmen
Im vorherigen Schritt haben wir Änderungen in einem laufenden Container vorgenommen, indem wir eine Datei erstellt haben. Jetzt lernen wir, wie wir diese Änderungen als neues Docker-Image speichern können. Dieser Vorgang wird als "Committing" eines Containers bezeichnet.
Durch das Committen eines Containers wird ein neues Image erstellt, das die Änderungen am Dateisystem und der Konfiguration des Containers enthält. Dies ist nützlich, um benutzerdefinierte Images auf Basis bestehender Images zu erstellen.
Um den Container zu committen, verwenden wir den Befehl docker commit. Die grundlegende Syntax lautet docker commit [container_name] [new_image_name]. Wir werden den Container my-ubuntu committen und das neue Image my-ubuntu-modified nennen.
docker commit my-ubuntu my-ubuntu-modified
Sie sollten eine lange Zeichenkette als Ausgabe sehen, die die ID des neu erstellten Images darstellt.
Überprüfen wir nun, ob das neue Image erstellt wurde. Mit dem Befehl docker images können wir alle Images auf Ihrem System auflisten.
docker images
In der Ausgabe sollten Sie my-ubuntu-modified zusammen mit dem ursprünglichen ubuntu-Image sehen.
Um zu bestätigen, dass die Änderungen im neuen Image gespeichert wurden, starten wir einen neuen Container basierend auf my-ubuntu-modified und überprüfen die im vorherigen Schritt erstellte Datei.
docker run -it --name my-ubuntu-test my-ubuntu-modified /bin/bash
Sobald Sie sich im neuen Container befinden, prüfen Sie die Existenz der Datei /hello.txt.
cat /hello.txt
Sie sollten die Ausgabe "Hello from inside the container!" sehen, was bestätigt, dass die Änderungen erfolgreich in das neue Image übernommen wurden.
Verlassen Sie nun den Container.
exit
Abschließend bereinigen wir den zu Testzwecken erstellten Container.
docker rm -f my-ubuntu-test
Container-Änderungen mit neuen Konfigurationen übernehmen
In diesem Schritt untersuchen wir, wie Container-Änderungen übernommen werden können und dabei neue Konfigurationseinstellungen für das resultierende Image hinzugefügt werden. Dies ermöglicht es Ihnen, Aspekte wie den Standardbefehl beim Start eines Containers oder Umgebungsvariablen zu definieren.
Wir verwenden weiterhin den my-ubuntu-Container aus den vorherigen Schritten. Zuerst stoppen wir den Container, da wir seinen aktuellen Zustand übernehmen werden.
docker stop my-ubuntu
Sie sollten den Containernamen my-ubuntu als Ausgabe sehen, was anzeigt, dass er gestoppt wurde.
Nun übernehmen wir den Container und fügen dem neuen Image ein Label hinzu. Labels sind Schlüssel-Wert-Paare, die Images als Metadaten hinzugefügt werden können. Wir fügen ein Label hinzu, das die Version unseres modifizierten Images angibt. Wir verwenden das Flag -c gefolgt von der Konfigurationsanweisung.
docker commit -c 'LABEL version="1.0"' my-ubuntu my-ubuntu-labeled
Sie sollten die ID des neu erstellten Images als Ausgabe sehen.
Überprüfen wir, ob das neue Image my-ubuntu-labeled erstellt wurde und das Label angewendet wurde. Mit dem Befehl docker inspect können wir detaillierte Informationen zum Image anzeigen.
docker inspect my-ubuntu-labeled
Die Ausgabe ist ein großes JSON-Objekt. Suchen Sie nach dem Abschnitt "Labels" innerhalb des "Config"-Blocks. Dort sollten Sie "version": "1.0" finden.
Alternativ können Sie docker inspect mit Filterung verwenden, um speziell nach dem Label zu suchen.
docker inspect --format '{{.Config.Labels}}' my-ubuntu-labeled
Dieser Befehl gibt nur die mit dem Image verknüpften Labels aus. Sie sollten etwas wie map[version:1.0] sehen.
Wir können während des Commit-Vorgangs auch andere Konfigurationen hinzufügen, wie z.B. das Setzen einer Umgebungsvariable. Lassen Sie uns den my-ubuntu-Container erneut übernehmen, diesmal mit einer Umgebungsvariable.
docker commit -c 'ENV MY_VARIABLE="Hello Docker"' my-ubuntu my-ubuntu-env
Überprüfen Sie das neue Image und die Umgebungsvariable mit docker inspect.
docker inspect --format '{{.Config.Env}}' my-ubuntu-env
Sie sollten eine Ausgabe ähnlich wie [PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin MY_VARIABLE=Hello Docker] sehen, was bestätigt, dass die Umgebungsvariable gesetzt ist.
Container-Änderungen mit neuen CMD- und EXPOSE-Anweisungen übernehmen
In diesem letzten Schritt lernen wir, wie Container-Änderungen übernommen werden können und dabei Standardbefehle (CMD) sowie freigegebene Ports (EXPOSE) für das neue Image festgelegt werden.
Die CMD-Anweisung definiert den Standardbefehl, der ausgeführt wird, wenn ein Container aus dem Image gestartet wird, ohne dass ein spezifischer Befehl angegeben wird. Die EXPOSE-Anweisung teilt Docker mit, dass der Container zur Laufzeit auf den angegebenen Netzwerkports lauscht.
Wir werden den my-ubuntu-Container erneut übernehmen, diesmal mit einem Standardbefehl zum Anzeigen des Inhalts von /hello.txt und der Freigabe von Port 80.
Stellen Sie zunächst sicher, dass der my-ubuntu-Container gestoppt ist.
docker stop my-ubuntu
Nun übernehmen wir den Container mit den CMD- und EXPOSE-Anweisungen. Beachten Sie, dass die CMD-Anweisung als JSON-Array von Strings angegeben wird.
docker commit -c 'CMD ["cat", "/hello.txt"]' -c 'EXPOSE 80' my-ubuntu my-ubuntu-final
Sie sollten die ID des neu erstellten Images als Ausgabe sehen.
Überprüfen wir die CMD- und EXPOSE-Konfigurationen des neuen Images my-ubuntu-final mit docker inspect.
docker inspect --format '{{.Config.Cmd}}' my-ubuntu-final
Dies sollte [cat /hello.txt] ausgeben, was die gesetzte Standardbefehlsanweisung bestätigt.
Prüfen wir nun die freigegebenen Ports.
docker inspect --format '{{.Config.ExposedPorts}}' my-ubuntu-final
Sie sollten eine Ausgabe ähnlich wie map[80/tcp:{}] sehen, was anzeigt, dass Port 80 freigegeben ist.
Abschließend starten wir einen Container aus diesem neuen Image ohne spezifischen Befehl, um zu testen, ob der Standard-CMD funktioniert.
docker run --rm my-ubuntu-final
Das Flag --rm entfernt den Container automatisch nach Beendigung. Da der Standardbefehl cat /hello.txt ist, sollte der Container starten, "Hello from inside the container!" ausgeben und sich dann beenden.
Sie sollten "Hello from inside the container!" in Ihrem Terminal sehen.
Dies demonstriert, wie Sie Container-Änderungen übernehmen und gleichzeitig das Standardverhalten sowie die Netzwerkkonfiguration des resultierenden Images definieren können.
Zusammenfassung
In diesem Lab haben Sie gelernt, wie man einen Docker-Container startet und modifiziert. Sie haben ein Ubuntu-Image heruntergeladen, einen interaktiven Container darauf basierend gestartet, eine Datei innerhalb des Containers erstellt und dann die Shell des Containers verlassen, während der Container weiterhin lief.
Anschließend haben Sie gelernt, wie man die Änderungen innerhalb eines laufenden Containers übernimmt, um ein neues Docker-Image zu erstellen. Dieser Prozess ermöglicht es Ihnen, den aktuellen Zustand eines Containers als wiederverwendbares Image zu speichern.



