GNU/Linux >> LINUX-Kenntnisse >  >> Panels >> Docker

So verwenden Sie Docker Commit zum Ändern von Container-Images

Ein Markenzeichen von Docker-Containern ist die Unveränderlichkeit. Sie können Container jederzeit zerstören und neu erstellen, um den Ausgangszustand wiederherzustellen. Verwenden des docker commit Befehl können Sie neue Änderungen an einem Container-Image festschreiben, aber es ist nicht so einfach, wie Sie es erwarten würden.

Sehen wir uns an, wie Sie mit docker commit Änderungen an einem neuen Container-Image festschreiben Befehl!

Wann sollten Änderungen an einem neuen Container-Image übernommen werden?

Container sind so gebaut, dass sie unveränderlich (nicht geändert) sind, warum sollten Sie also Änderungen an einem Container festschreiben? Dafür gibt es einige Gründe.

  • Während der Entwicklung eines neuen containerisierten Dienstes zum schnellen Testen von Änderungen.
  • Führen Sie eine schnelle Fehlerbehebung eines Produktionsdienstes durch, ohne zuerst das Quellbild reparieren zu müssen.
  • Verwenden Sie commit um ein Bild aufzunehmen und das Bild auf einen neuen Server zu exportieren.

Obwohl diese möglicherweise nicht alle potenziellen Szenarien abdecken, sind dies einige, die die Verwendung von docker commit erforderlich machen ein perfekter Anwendungsfall.

Änderungen an einem einfachen Image festschreiben

Für einen scheinbar einfachen Befehl leistet dieser Befehl viel.

Unten ist ein einfaches Beispiel commit Befehl. Verwenden einer laufenden Container-ID, d3fdd3517e0a In diesem Beispiel wird ein neues Image in einem Repo namens myrepository erstellt und benannt changedimage .

Das Originalbild ist als version2 gekennzeichnet , was nicht notwendig, aber nützlich ist, um Änderungen zwischen gleichnamigen Bildern nachzuverfolgen.

Beides myrepository und changedimage sind willkürlich ausgewählt, aber diese würden normalerweise richtig gekennzeichnete Ressourcen wie customimages/alpine-linux widerspiegeln .

docker commit d3fdd3517e0a myrepository/changedimage:version2

Docker-Container sind eine Reihe von schreibgeschützten Images mit einer Read-Write-Schicht darüber. Im obigen Beispiel hält Docker den laufenden Container an. Diese Pause dient dazu, eine versehentliche Datenbeschädigung zu verhindern, während Docker das Image erstellt

Da diese Pause Dienstunterbrechungen verursachen könnte, können Sie --pause=false verwenden . Dies könnte Daten beschädigen, da Schreibvorgänge möglicherweise nicht erfolgreich abgeschlossen werden.

Zusätzlich das commit Der Vorgang lässt Daten aus, die in Volumes enthalten sind, die im Container bereitgestellt sind. Da Volumes nicht Teil des Dateisystems des Containers selbst sind, ignoriert Docker sie.

Sobald der Commit-Vorgang abgeschlossen ist, erstellt Docker eine neue Ebene mit den Änderungen aus dem ursprünglichen Image unter dem neuen Container-Image-Namen.

Voraussetzungen

Die einzige Voraussetzung in diesem Tutorial ist Docker selbst. Dies kann über die Docker Desktop-Software unter Windows oder über ein Paket unter Linux installiert werden.

Verwandt:Bereitstellen Ihres ersten Docker-Containers in Windows

Übernehmen von Änderungen an einem neuen Docker-Container-Image

Sehen wir uns nun einige gängige Szenarien an, die der docker commit durchführt Befehl kann nützlich sein für.

Ziehen Sie zunächst ein Alpine-Linux-Container-Image aus dem öffentlichen Docker-Repository herunter. Alpine ist bekannt für seine schlanken Container, wie an der Größe von ~5 MB zu erkennen ist.

# Pull the latest Alpine Linux image
docker pull alpine
# List all Docker images
docker images

Containerentwicklung und -test

Der primäre Anwendungsfall für docker commit ist die Entwicklung eines neuen Container-Images. Dieses Image kann letztendlich als Basis für andere Images oder als Produktionscontainer selbst verwendet werden.

Im Beispiel-Snippet unten ist Docker:

  • Ausführen des zuvor gezogenen alpine Bild
  • Öffnen einer interaktiven Shell zum Installieren eines Pakets
  • Installation des htop-Pakets
# Open an interactive shell to the Docker Alpine Linux container
docker run -it a24bb4013296 bin/sh
# Install the HTOP package
apk add htop

Sie können unten sehen, dass das Paket korrekt im Container installiert ist, indem Sie htop ausführen Befehl.

Nachdem Sie das Paket auf der neuen „Ebene“ installiert haben, sollten Sie diese Änderung nun auf das ursprüngliche Basis-Image übertragen. Dazu:

  • Führen Sie docker ps -a aus um die Container-ID zu finden.
  • Übertragen Sie den Inhalt der aktuellen Ebene mithilfe der Container-ID in ein neues Basis-Image.

Im Beispiel unten heißt das neue Bild alpine-htop und mit version1 gekennzeichnet . Das Bild ist gekennzeichnet, um ähnlich benannte Docker-Bildversionen leichter nachverfolgen zu können.

# List all Docker containers regardless of status, -a or --all to show every container
docker ps -a
# Commit the layer to a new image named alpine-htop and tagged version1
docker commit b57e066d5bfa alpine-htop:version1
# List all images available
docker images

Fehlerbehebung in Produktionsimages

Oft haben Sie einen Produktionsdienst, der einen Fehler aufweist. Möglicherweise gibt es einen bekannten Fix, und Sie könnten einen Fix schneller anwenden, als die vorhandenen Konfigurationen zu ändern und erneut bereitzustellen. Verwenden von docker commit , können Sie den Fix schnell anwenden und dann im Hintergrund daran arbeiten, die anderen erforderlichen Komponenten zu aktualisieren.

Dieses Beispiel-Snippet unten zeigt die Installation von NGINX in einem Alpine-Linux-Docker-Image.

# First List the available images
docker images
# Run an interactive session for the alpine-htop image
docker run -it a24bb4013296 bin/sh
# Install the NGINX package
apk add nginx
# Create the location for the NGINX PID file
mkdir /run/nginx
# Verify that NGINX is installed
nginx -v
# Run NGINX
/usr/sbin/nginx
# Verify that NGINX is properly running
ps | grep nginx
# Kill the NGINX process
kill 18
# Verify that the NGINX process is no longer active
ps | grep nginx

Übertragen Sie den oben erstellten neuen NGINX-Container in ein neues Image mit dem Namen alpine-nginx und mit dem Tag version1 . Das Taggen des Bildes ist eine bewährte Methode, um verschiedene Versionen desselben Bildes unterscheiden zu können.

# List all Docker containers regardless of status, -a or --all to show every container
docker ps -a
# Commit the changes to a new image named alpine-nginx
docker commit 37043139525c alpine-nginx:version1
# Verify that the new image was created
docker images

Nicht jede ausführbare Datei kann im Hintergrund ausgeführt werden, und NGINX ist nicht anders. Um diesen Container ordnungsgemäß auszuführen, während NGINX im Hintergrund ausgeführt wird, übergeben Sie den -g 'daemon off;' Option zu NGINX.

# Run the NGINX container in the background
docker run -d f6b46a3b76be /usr/sbin/nginx -g 'daemon off;'
# Verify that the container is running
docker ps -a

Verwenden Sie schließlich --change wechseln, um Port 80 verfügbar zu machen. Durch die Verwendung von --change Parameter, der EXPOSE 80 Der Befehl wird in das DockerFile des Containers geschrieben. Starten Sie nach dieser Änderung den neuen Container. Nachdem der neue Container gestartet wurde, stoppen Sie den vorherigen Container, der fälschlicherweise ohne den offengelegten Port ausgeführt wurde. Dies trägt dazu bei, den nicht funktionierenden Container problemlos in den funktionierenden Container zu überführen.

# List all running containers
docker ps -a
# Commit the changes to a new image with an exposed port 80
docker commit --change "EXPOSE 80" c649c813d985 alpine-nginx:version2
# List the running containres
docker ps -a
# List all Docker images
docker images
# Run the newly created image
docker run -d c71f0f9cef7b /usr/sbin/nginx -g 'daemon off;'
# List running containers
docker ps -a
# Stop the prior container without the exposed port 80
docker stop c649c813d985
# List running containers
docker ps -a

Snapshot eines Docker-Image

Was ist schließlich mit einem Szenario, in dem Sie möglicherweise ein Point-in-Time-Image eines laufenden Containers erstellen müssen, um den Container auf einen neuen Server zu verschieben? Der docker commit Der Befehl eignet sich dafür gut, wie Sie unten sehen können.

Die folgenden Befehle erstellen einen laufenden Container, den wir anhalten und einem neuen alpine-nginx zuweisen Version.

# List running Docker containers
docker ps -a
# Create a new running Docker NGINX container
docker run -d c71f0f9cef7b
# List running Docker containers
docker ps -a
# Stop the Docker container
docker stop 7ff99f2bcf6b
# Create a new alpine-nginx version to export
docker commit 7ff99f2bcf6b alpine-nginx:version3
# List the Docker images available
docker images

Exportieren Sie das Docker-Image in eine Datei. In diesem Beispiel heißt die Exportdatei export.tar , aber benennen Sie die Datei nach Ihren Bedürfnissen. Importieren Sie abschließend die export.tar Datei zurück in Docker, um den End-to-End-Prozess zu demonstrieren.

Stellen Sie sicher, dass Sie im Format repo:tag exportieren wenn Sie möchten, dass diese Labels beim erneuten Importieren des Bildes beibehalten werden.

# Save the image to a file on the local disk
docker save -o export.tar alpine-nginx:version3
# Verify that the image exists
ls
# Remove the just exported Docker image
docker rmi 39ca9e64828a
# List Docker images and verify that the image is removed
docker images
# Load the Docker image back in
docker load -i export.tar
# List Docker images and show that the image has been loaded back in
docker images

Zusätzliche Optionen für den Docker-Commit-Befehl

Nutzung der zusätzlichen Optionen, die für commit verfügbar sind Befehl werden viele verschiedene Szenarien unterstützt.

Pausieren des Containers

Um den Container während der Ausführung nicht anzuhalten, können Sie --pause=false übergeben Befehl zum Deaktivieren der Pausenfunktion. Dies wird häufig verwendet, wenn ein Produktionsdienst gesichert wird und das Anhalten dieses Dienstes nachteilig wäre.

Der Pause-Befehl hat auch eine Abkürzung von -p das ist vielleicht schneller zu gebrauchen. Beachten Sie jedoch, dass Sie durch das Umgehen des Anhaltens des Containers eine Datenbeschädigung riskieren, wenn ein Dateisystemschreibvorgang auftritt, der dazu führen kann, dass unvollständige oder beschädigte Daten geschrieben werden.

Eine Commit-Nachricht hinterlassen

Vielen Entwicklern ist es vertraut, eine richtige Commit-Nachricht bereitzustellen. Genau wie bei der Verwendung der Quellcodeverwaltung möchten Sie idealerweise eine nützliche Nachricht geben, die erklärt, warum eine neue Version des Containers festgeschrieben wurde.

Dies kann durch die Verwendung von --message="message to commit" erfolgen Befehl. Wie zuvor gibt es eine Kurzversion dieses Befehls, -m . Um die Liste der Docker-Commit-Nachrichten anzuzeigen, verwenden Sie den docker history Befehl.

Definieren des Autors

Um richtig anzugeben, wer die Änderung erstellt, können Sie einen Autorwert angeben, der zusätzlichen Kontext dazu gibt, wer die Änderung vornimmt. Dies kann über den --author="Jane Author ([email protected])" verwendet werden . Dieser Befehl kann auch über die Kurzform -a verwendet werden . Mit docker inspect Sie können eine JSON-Auflistung von Containerinformationen abrufen, einschließlich Bezeichnungen wie Autor.

Paralleles Anwenden von DockerFile-Änderungen

Schließlich der komplizierteste Befehl, der im docker commit verwendet werden kann Befehl ist der change Parameter. Dieser Parameter wendet Änderungen im Container gleichzeitig mit dem Commit auf das DockerFile an.

Sie können den change verwenden Parameter, indem Sie Anweisungen wie folgt an die Dockerfile übergeben:--change="ENV TEST true" . Dieser Befehl setzt den Text ENV TEST true in die Docker-Datei. Wenn der Container jetzt neu gestartet wird, werden die Änderungen, die Sie hier festlegen, bereits angewendet.

Anstelle von --change Name, können Sie eine Abkürzung nehmen und den -c verwenden Pseudonym.

Mit diesem Befehl können Sie auch mehrere --change verketten Parameter zusammen. Auf diese Weise können Sie problemlos mehrere Änderungen in einem Commit-Befehl zu einer Docker-Datei hinzufügen.

Parameteroptionen ändern

Mit dem change können Sie nur wenige Befehle verwenden Parameter wie unten gezeigt.

  • CMD – Die CMD-Anweisung hat die Form CMD ["executable","parameter1","parameter2"] . Dies ist die bevorzugte Methode, aber denken Sie daran, dass nur eine CMD können gleichzeitig in einem DockerFile vorhanden sein. Die letzte CMD wird derjenige sein, der wirksam wird. Der Hauptzweck von CMD ist die Bereitstellung von Standardausführungsbefehlen für einen Container bei der Erstellung.
  • ENTRYPOINT – Ähnlich wie der CMD-Befehl verwendet ENTRYPOINT die Syntax von ENTRYPOINT ["executable","parameter1","parameter2"] . Diese Syntax wirft die Frage auf, warum ENTRYPOINT über CMD verwendet werden soll?

    Der ENTRYPOINT-Befehl führt eine ausführbare Datei als primären Prozess von PID 1 aus . Diese Aktion ermöglicht es Ihnen dann, den Prozess mit docker stop herunterzufahren anmutig. Zusätzlich können Sie CMD verwenden dabei durch weglassen der executable Teil, der diese Parameter an den ENTRYPOINT übergibt ausführbar.
  • ENV – Da die meisten Anwendungen Umgebungsvariablen verwenden, können Sie diese mit dem ENV-Befehl einfach im Schlüsselwertformat ENV key=value festlegen . Greifen Sie auf diese Schlüssel=Wert-Variablen als Standard-Linux-Umgebungsvariablen zu.
  • EXPOSE – Der Befehl EXPOSE legt einen Port und ein optionales Protokoll außerhalb des Containers offen. Dieser Befehl ordnet Ports innerhalb des Containers der Außenseite des Containers zu und ermöglicht Containern die Interaktion mit externen Ressourcen wie einem Webserver, der Inhalte bereitstellt.
  • LABEL – Der Befehl LABEL fügt einem Container Metadaten hinzu. Sie können Metadaten hinzufügen, indem Sie das Format LABEL version="2.0" verwenden Um die zusätzlichen Metadaten anzuzeigen, verwenden Sie den Docker-Befehl image inspect.
  • ONBUILD – Der ONBUILD-Befehl fügt eine Anweisung hinzu, die später ausgeführt wird, wenn das Image als Basis für einen weiteren Container-Build verwendet wird. Dieser Parameter verwendet die ADD- und RUN-Befehle, um Inhalte mit dem ADD-Befehl hinzuzufügen oder eine ausführbare Datei zu RUN.
  • USER -Der USER-Befehl legt den Benutzernamen (oder UID) und optional die Benutzergruppe (oder GID) fest, die beim Ausführen des Abbilds verwendet werden sollen. Das sieht so aus:USER myuser:mygroup in der Praxis.
  • Volumen – Bei den meisten Containern ist es notwendig, auf irgendeine Weise auf Daten zuzugreifen. Der Befehl VOLUME erstellt einen Bereitstellungspunkt mit einem angegebenen Namen, der ihn als einen extern bereitgestellten Datenträger kennzeichnet. Dies wird allgemein so verwendet, VOLUME ["/data"] .
  • WORKDIR – Schließlich legt der WORKDIR-Befehl das Arbeitsverzeichnis der CMD- oder ENTRYPOINT-Befehle fest. Dies wird wie folgt verwendet:WORKDIR /path/to/directory . WORKDIR ist nützlich, wenn Sie eine ausführbare Datei starten müssen, der Speicherort sich jedoch nicht in der Standardumgebungsvariablen PATH befindet.

Fazit

Der docker commit Befehl ist überraschend komplex. Obwohl es eine einfache Syntax mit der Möglichkeit gibt, DockerFile-Änderungen hinzuzufügen, während Sie den Commit-Befehl verwenden, können Sie schnell Änderungen vornehmen, die bei der nächsten Erstellung des Containers über DockerFile bestehen bleiben.

Dieser Befehl ist möglicherweise nicht in allen Situationen erforderlich, aber für eine schnelle Fehlerbehebung und zum Erstellen von Snapshots von Containern, die problemlos zwischen Servern verschoben werden können, wird der Commit-Befehl schnell sehr nützlich!


Docker
  1. So verwenden Sie ein Dockerfile zum Erstellen eines Docker-Images

  2. So teilen Sie Docker-Images mit anderen

  3. So erstellen Sie ein benutzerdefiniertes Image aus einem Docker-Container

  4. So erstellen Sie ein Docker-Image aus einem Container und einer Docker-Datei

  5. Wie verwende ich lokale Docker-Images mit Minikube?

So verwenden Sie Docker Scan, um Schwachstellen in Ihren Bildern zu finden

So prüfen Sie den Inhalt eines Docker-Images, ohne einen Container zu starten

So erstellen Sie ein Docker-Image aus einem laufenden Container

So verwenden Sie Docker:Bild speichern und zum Teilen exportieren

So aktualisieren Sie Docker-Images auf die neueste Version

So listen / suchen / ziehen Sie Docker-Images unter Linux