Docker-Images sind so konzipiert, dass sie unveränderlich sind und nach ihrer Erstellung unverändert bleiben. Diese Eigenschaft trägt zu einer zuverlässigen Umgebung für Entwickler und Betreiber bei, da jeder Container, der aus demselben Image erstellt wird, identisch funktioniert. Außerdem vereinfacht sie die Verwaltung verschiedener Image-Versionen. Es kann jedoch vorkommen, dass Sie Elemente innerhalb eines laufenden Containers ändern müssen, beispielsweise eine Konfiguration aktualisieren oder neue Softwarepakete hinzufügen. In solchen Fällen docker commitist der Befehl `docker-image` von unschätzbarem Wert, da er es Ihnen ermöglicht, Änderungen an einem laufenden Container zu speichern und basierend auf diesen Änderungen ein neues Image zu generieren. Diese Funktionalität ist besonders vorteilhaft für schnelles Testen, iterative Entwicklung und die Erstellung benutzerdefinierter Images, ohne dass ein vollständiger Neuaufbau erforderlich ist.
Die Unveränderlichkeit von Docker-Images verstehen
Die Architektur von Docker-Images besteht aus mehreren schreibgeschützten Schichten. Beim Ausführen eines Containers fügt Docker eine beschreibbare Schicht, die sogenannte Containerschicht, hinzu. Alle Änderungen erfolgen ausschließlich in dieser obersten Schicht. Sobald der Container entfernt wird, gehen alle darin vorgenommenen Änderungen verloren, wodurch die Integrität des ursprünglichen Images erhalten bleibt. Dieses Design bietet mehrere entscheidende Vorteile:
- Einheitliches Verhalten für Container, die vom selben Image abgeleitet sind, um Konsistenz zu gewährleisten.
- Isolierung von Änderungen zwischen Containern zur Verbesserung der Vorhersagbarkeit.
- Sicheres Tagging spezifischer Bildversionen, ohne dass Änderungen befürchtet werden müssen, die andere Versionen beeinträchtigen.
Diese Struktur fördert zwar die Stabilität, stellt aber eine Herausforderung für die sofortige Anpassung eines laufenden Containers dar. Hier docker commiterweist sich der Befehl als entscheidend.
Generieren eines neuen Images aus einem laufenden Container
Mithilfe dieses docker commitBefehls lässt sich der aktuelle Zustand eines laufenden Containers abbilden, wodurch ein neues Image erstellt wird. Dabei werden alle vorgenommenen Änderungen, wie beispielsweise installierte Anwendungen oder Konfigurationsänderungen, erfasst und in einer neuen Ebene gespeichert. Das Original-Image bleibt unverändert, was Experimente und schnelle Iterationen ermöglicht.

Diese Funktion eignet sich ideal, um benutzerdefinierte Konfigurationen für die zukünftige Verwendung zu sichern, kleinere Korrekturen während des Testens vorzunehmen oder aktualisierte Images mit Ihrem Team zu teilen, ohne von vorn beginnen zu müssen. Die allgemeine Syntax für den docker commitBefehl lautet wie folgt:
docker commit [OPTIONS] CONTAINER_ID NEW_IMAGE_NAME[:TAG]
In dieser Syntax:
-
CONTAINER_IDDie eindeutige ID oder der Name des Containers, den Sie erfassen möchten. -
NEW_IMAGE_NAMEDer gewünschte Name für das neu erstellte Bild. -
TAGEin optionaler Parameter, dessen Standardwert auf „latest“ gesetzt ist.
Der docker commitBefehl bietet außerdem verschiedene Optionen zum Hinzufügen von Metadaten, zum Implementieren von Konfigurationsänderungen und zum Anpassen des Commit-Verhaltens. Die folgende Tabelle gibt einen Überblick über die verfügbaren Optionen:
| Option | Langform | Beschreibung | Beispiel |
|---|---|---|---|
| -A | -Autor | Enthält den Namen des Autors in den Bildmetadaten. | docker commit -a "Anees"my-container my-image |
| -C | -ändern | Wendet Dockerfile-Anweisungen wie ENV, LABEL oder CMD auf das neue Image an. | docker commit -c "ENV APP_ENV=prod"my-container my-image |
| -M | -Nachricht | Fügt eine kurze Nachricht hinzu, die die im Bild vorgenommenen Änderungen zusammenfasst. | docker commit -m "Installed curl"my-container my-image |
| -P | -Pause | Hält den Container während des Commit-Prozesses an, um die Konsistenz zu gewährleisten (Standard: true). | docker commit --pause=false my-container my-image |
Schritt-für-Schritt-Anleitung zur Verwendung von docker commit
Um die praktische Anwendung zu veranschaulichen docker commit, nehmen wir an, Sie möchten das curl-Dienstprogramm in einem Alpine-Container installieren, ohne Ihre Dockerfile ändern zu müssen. Sie würden zunächst einen Container aus dem Alpine-Basisimage starten:
docker run -it alpine:latest /bin/sh
Sobald Sie sich im Container befinden, führen Sie die folgenden Befehle aus, um die notwendigen Anpassungen vorzunehmen:
apk update && apk add curl

Nachdem Sie Ihre Änderungen abgeschlossen haben, verlassen Sie den Container:
exit
Als Nächstes müssen diese Änderungen übernommen werden, um ein neues Image zu erstellen:
docker commit <container_id> alpine-with-curl:1.0

Um die Erstellung Ihres neuen Images zu bestätigen, führen Sie Folgendes aus:
docker images
Sie können nun das neue Image verwenden, in dem curl vorinstalliert ist:

Testen Ihres neuen Docker-Images
Sobald Ihr neues Image erstellt ist, können Sie einen darauf basierenden Container ausführen, um sicherzustellen, dass Ihre Änderungen gespeichert werden:
docker run -it alpine-with-curl:1.0 /bin/sh
Dieser Befehl öffnet eine interaktive Shell innerhalb des aus dem alpine-with-curl:1.0Image generierten Containers. Sie können überprüfen, ob Ihre Änderungen erhalten bleiben:
curl --version
Durch Ausführen dieses Befehls wird bestätigt, dass Ihre Änderungen im neuen Image erhalten geblieben sind.

docker commit vs Dockerfile: Das richtige Werkzeug auswählen
Obwohl sowohl Dockerfiles als auch docker commitDocker-Images die Erstellung von Docker-Images erleichtern, haben sie unterschiedliche Zwecke und Anwendungsbereiche. Ein Dockerfile ist die bevorzugte Methode, wenn konsistente und reproduzierbare Builds erforderlich sind, insbesondere für Continuous Integration und Produktionsumgebungen. Diese Methode bietet eine klare und prägnante Dokumentation aller Änderungen im Codeformat und erleichtert so deren Verwaltung, Analyse und Kontrolle im Laufe der Zeit. Dies garantiert, dass zukünftige Image-Builds die gleichen Ergebnisse liefern, was für den laufenden Support und die Zusammenarbeit im Team entscheidend ist.
Umgekehrt docker commitist diese Methode vorteilhaft, um schnell Fehler zu beheben, Tests durchzuführen oder kleinere Anpassungen spontan vorzunehmen, ohne die gesamte Dockerfile überarbeiten zu müssen. Sie ist besonders nützlich beim Experimentieren, Debuggen oder der sofortigen Validierung von Änderungen. Aufgrund der mangelnden Dokumentation eignet sie sich jedoch eher für temporäre Anpassungen als für den langfristigen Produktiveinsatz.
Zusammenfassend lässt sich sagen, dass Sie docker commitDockerfiles primär für Experimente und temporäre Lösungen verwenden sollten, während Sie für produktionsreife Images auf Dockerfiles setzen. Die Erweiterung Ihrer Kenntnisse über weitere wichtige Docker-Befehle wird Ihre Erfahrung im Umgang mit Containern, Images und integrierten Workflows verbessern.
Schreibe einen Kommentar