Schritt-für-Schritt-Anleitung zum Klonen eines Docker-Container-Images

DockerDockerBeginner
Jetzt üben

💡 Dieser Artikel wurde von AI-Assistenten übersetzt. Um die englische Version anzuzeigen, können Sie hier klicken

Einführung

Dieses Tutorial führt Sie durch den Prozess des Klonens eines Docker-Container-Images. Docker-Images sind verpackte Vorlagen, die alles enthalten, was zum Ausführen einer Anwendung benötigt wird, und das Klonen ermöglicht es Ihnen, Kopien zu erstellen, die Sie dann anpassen können. Am Ende dieser Anleitung werden Sie verstehen, wie man ein Docker-Image klont, modifiziert und für die Bereitstellung freigibt.

Docker verstehen und Ihre Umgebung überprüfen

Bevor wir mit dem Klonen von Docker-Images beginnen, ist es wichtig zu verstehen, was Docker ist, und zu überprüfen, ob unsere Umgebung richtig eingerichtet ist.

Was ist Docker?

Docker ist eine Plattform, die Container verwendet, um Anwendungen zu entwickeln, bereitzustellen und auszuführen. Container verpacken eine Anwendung mit all ihren Abhängigkeiten und stellen so sicher, dass sie in verschiedenen Umgebungen konsistent funktioniert. Dies macht Docker besonders nützlich für Entwicklungs- und Bereitstellungs-Workflows.

Überprüfen der Docker-Installation

Lassen Sie uns zunächst sicherstellen, dass Docker korrekt auf unserem System installiert ist. Öffnen Sie ein Terminalfenster und führen Sie aus:

docker --version

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

Docker version 20.10.21, build baeda1f

Als Nächstes überprüfen Sie, ob der Docker-Dienst läuft:

sudo systemctl status docker

Die Ausgabe sollte anzeigen, dass Docker aktiv (läuft) ist. Wenn es nicht läuft, können Sie es mit folgendem Befehl starten:

sudo systemctl start docker

Testen der Docker-Funktionalität

Lassen Sie uns einen einfachen Testbefehl ausführen, um zu überprüfen, ob Docker ordnungsgemäß funktioniert:

docker run hello-world

Dieser Befehl lädt das hello-world-Image herunter und führt es aus, das eine Bestätigungsmeldung ausgibt und beendet wird. Sie sollten eine Ausgabe ähnlich der folgenden sehen:

Hello from Docker!
This message shows that your installation appears to be working correctly.

Auflisten von Docker-Images

Um zu sehen, welche Docker-Images derzeit auf Ihrem System verfügbar sind, führen Sie aus:

docker images

Dieser Befehl listet alle Docker-Images auf, die derzeit lokal gespeichert sind. Die Ausgabe zeigt das Image-Repository, den Tag, die Image-ID, das Erstellungsdatum und die Größe.

Nachdem wir nun bestätigt haben, dass Docker ordnungsgemäß funktioniert, sind wir bereit, im nächsten Schritt mit Docker-Images zu arbeiten.

Abrufen und Ausführen eines Docker-Images

In diesem Schritt werden wir ein Docker-Image von Docker Hub abrufen und auf unserem lokalen System ausführen. Dies ist der erste Schritt im Prozess des Klonens eines Docker-Images.

Was ist Docker Hub?

Docker Hub ist ein Cloud-basierter Registry-Dienst, in dem Benutzer Container-Images finden und freigeben können. Es enthält viele offizielle Images, die von Softwareanbietern verwaltet werden, sowie von der Community beigesteuerte Images.

Abrufen eines Images von Docker Hub

Lassen Sie uns das offizielle Nginx-Webserver-Image von Docker Hub abrufen. Nginx ist ein beliebter Webserver, den wir in diesem Tutorial als Beispiel verwenden werden.

Führen Sie den folgenden Befehl aus, um das Nginx-Image herunterzuladen:

docker pull nginx:latest

Dieser Befehl lädt die neueste Version des Nginx-Images herunter. Sie sollten eine Ausgabe sehen, die den Download-Fortschritt anzeigt:

latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest

Überprüfen des heruntergeladenen Images

Um zu bestätigen, dass das Image erfolgreich heruntergeladen wurde, listen Sie Ihre Docker-Images erneut auf:

docker images

Sie sollten jetzt das Nginx-Image in der Liste sehen:

REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
nginx        latest    605c77e624dd   2 weeks ago    142MB

Ausführen des Nginx Docker-Containers

Lassen Sie uns nun einen Container basierend auf dem Nginx-Image ausführen, das wir gerade abgerufen haben:

docker run --name my-nginx -d -p 8080:80 nginx

Dieser Befehl führt Folgendes aus:

  • --name my-nginx: Benennt unseren Container "my-nginx"
  • -d: Führt den Container im Detached-Modus (im Hintergrund) aus
  • -p 8080:80: Ordnet Port 8080 auf unserem Host Port 80 im Container zu
  • nginx: Verwendet das Nginx-Image, das wir zuvor abgerufen haben

Sie sollten eine lange Zeichenkette als Ausgabe sehen, die die Container-ID ist.

Überprüfen des laufenden Containers

Um zu überprüfen, ob der Container läuft:

docker ps

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS                  NAMES
f8d3e9c5b9a7   nginx     "/docker-entrypoint.…"   30 seconds ago   Up 29 seconds   0.0.0.0:8080->80/tcp   my-nginx

Sie können jetzt auf die Nginx-Standardseite zugreifen, indem Sie einen Webbrowser öffnen und zu http://localhost:8080 navigieren oder indem Sie curl verwenden:

curl http://localhost:8080

Sie sollten den HTML-Inhalt der Nginx-Willkommensseite sehen.

Nachdem wir nun erfolgreich ein Docker-Image abgerufen und ausgeführt haben, sind wir bereit, im nächsten Schritt unser eigenes benutzerdefiniertes Image basierend darauf zu erstellen.

Erstellen eines benutzerdefinierten Docker-Images

Nachdem wir nun einen laufenden Nginx-Container haben, erstellen wir ein benutzerdefiniertes Image, indem wir es modifizieren. Dies ist der Kern des Klonprozesses. Wir werden:

  1. Änderungen am laufenden Container vornehmen
  2. Ein neues Image aus diesen Änderungen erstellen
  3. Einen Container basierend auf unserem neuen Image ausführen

Docker-Image-Erstellung verstehen

Docker-Images können auf zwei Arten erstellt werden:

  1. Mithilfe eines Dockerfiles (der empfohlene Ansatz für die Produktion)
  2. Durch Übertragen von Änderungen, die an einem laufenden Container vorgenommen wurden (nützlich für Erkundung und Experimente)

Wir werden in diesem Tutorial den zweiten Ansatz verwenden, da er einfacher zu verstehen ist, um den Klonprozess zu verstehen.

Modifizieren des laufenden Containers

Zuerst erstellen wir eine benutzerdefinierte HTML-Datei, um die standardmäßige Nginx-Willkommensseite zu ersetzen. Wir müssen den laufenden Container betreten und seine Dateien ändern.

Verwenden Sie den folgenden Befehl, um eine Shell innerhalb des laufenden Containers auszuführen:

docker exec -it my-nginx bash

Dies öffnet eine interaktive Bash-Shell innerhalb des Containers. Erstellen wir nun eine benutzerdefinierte HTML-Datei:

echo "<html><body><h1>My Custom Docker Image</h1><p>This is a custom Nginx image created in the LabEx tutorial.</p></body></html>" > /usr/share/nginx/html/index.html

Sie können die Änderung überprüfen, indem Sie den Inhalt der Datei überprüfen:

cat /usr/share/nginx/html/index.html

Beenden Sie nun die Container-Shell:

exit

Testen der Änderungen

Testen wir, ob unsere Änderungen angewendet wurden, indem wir erneut auf den Nginx-Server zugreifen:

curl http://localhost:8080

Sie sollten jetzt unseren benutzerdefinierten HTML-Inhalt anstelle der standardmäßigen Nginx-Willkommensseite sehen.

Erstellen eines neuen Images aus dem modifizierten Container

Nachdem wir den Container modifiziert haben, erstellen wir ein neues Image, das diese Änderungen enthält. Dies geschieht mit dem Befehl docker commit:

docker commit my-nginx my-custom-nginx:v1

Dieser Befehl erstellt ein neues Image namens my-custom-nginx mit dem Tag v1 basierend auf dem aktuellen Zustand des Containers my-nginx.

Überprüfen des neuen Images

Überprüfen wir, ob unser neues Image erstellt wurde:

docker images

Sie sollten Ihr neues Image in der Liste sehen:

REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
my-custom-nginx   v1        a1b2c3d4e5f6   10 seconds ago   142MB
nginx             latest    605c77e624dd   2 weeks ago      142MB

Ausführen eines Containers aus dem neuen Image

Lassen Sie uns nun den ursprünglichen Container stoppen und entfernen und dann einen neuen Container basierend auf unserem benutzerdefinierten Image ausführen:

docker stop my-nginx
docker rm my-nginx
docker run --name my-custom-container -d -p 8081:80 my-custom-nginx:v1

Diese Befehle:

  1. Stoppen den ursprünglichen Container
  2. Entfernen den ursprünglichen Container
  3. Erstellen einen neuen Container basierend auf unserem benutzerdefinierten Image, das auf Port 8081 gemappt ist

Testen des neuen Containers

Überprüfen wir, ob unser neuer Container korrekt ausgeführt wird:

docker ps

Sie sollten Ihren neuen Container in der Liste sehen:

CONTAINER ID   IMAGE                COMMAND                  CREATED          STATUS          PORTS                  NAMES
g9h8i7j6k5l4   my-custom-nginx:v1   "/docker-entrypoint.…"   10 seconds ago   Up 9 seconds    0.0.0.0:8081->80/tcp   my-custom-container

Greifen Sie nun auf den Nginx-Server auf dem neuen Port zu:

curl http://localhost:8081

Sie sollten denselben benutzerdefinierten HTML-Inhalt sehen, was bestätigt, dass unser neues Image die von uns vorgenommenen Änderungen enthält.

Herzlichen Glückwunsch! Sie haben erfolgreich ein Docker-Image geklont und angepasst. Im nächsten Schritt erfahren wir, wie Sie dieses benutzerdefinierte Image freigeben können.

Verschlagworten und Freigeben Ihres Docker-Images

Nachdem wir nun ein benutzerdefiniertes Docker-Image erstellt haben, lernen wir, wie man es richtig verschlagwortet und für die Freigabe vorbereitet. In einem realen Szenario würden Sie das Image in eine Registry wie Docker Hub pushen, aber in diesem Tutorial konzentrieren wir uns auf die Vorbereitungsschritte.

Docker-Image-Tags verstehen

Docker-Images werden durch ihren Repository-Namen und Tag identifiziert. Tags helfen bei der Versionierung und Organisation von Images. Der Standard-Tag ist latest, aber es ist eine gute Praxis, aussagekräftige Versions-Tags zu verwenden.

Hinzufügen weiterer Tags zu Ihrem Image

Fügen wir unserem benutzerdefinierten Image ein paar weitere Tags hinzu:

docker tag my-custom-nginx:v1 my-custom-nginx:latest
docker tag my-custom-nginx:v1 my-custom-nginx:stable

Diese Befehle erstellen zwei zusätzliche Tags für unser Image: latest und stable. Die tatsächlichen Image-Daten werden zwischen allen drei Tags geteilt, daher ist dieser Vorgang sehr effizient.

Überprüfen der Tags

Überprüfen wir unsere Images erneut:

docker images

Sie sollten jetzt mehrere Einträge für my-custom-nginx sehen:

REPOSITORY        TAG       IMAGE ID       CREATED          SIZE
my-custom-nginx   v1        a1b2c3d4e5f6   10 minutes ago   142MB
my-custom-nginx   latest    a1b2c3d4e5f6   10 minutes ago   142MB
my-custom-nginx   stable    a1b2c3d4e5f6   10 minutes ago   142MB
nginx             latest    605c77e624dd   2 weeks ago      142MB

Beachten Sie, dass alle my-custom-nginx-Images dieselbe Image-ID haben, was darauf hindeutet, dass es sich um dasselbe Image mit unterschiedlichen Tags handelt.

Vorbereiten der Image-Verteilung

In einem realen Szenario würden Sie Ihr Image in eine Registry wie Docker Hub pushen. Dazu müssten Sie:

  1. Ein Konto auf Docker Hub erstellen
  2. Sich von Ihrem Terminal aus bei Docker Hub anmelden
  3. Ihr Image mit Ihrem Docker Hub-Benutzernamen taggen
  4. Das Image pushen

Nehmen wir für Demonstrationszwecke an, dass Ihr Docker Hub-Benutzername yourusername ist. So bereiten Sie Ihr Image für das Pushen vor:

docker tag my-custom-nginx:v1 yourusername/my-custom-nginx:v1

Um das Image zu pushen (in einem realen Szenario), würden Sie Folgendes verwenden:

## Dies dient nur zur Demonstration - wir werden es nicht tatsächlich pushen
## docker push yourusername/my-custom-nginx:v1

Speichern eines Docker-Images in einer Datei

Anstatt in eine Registry zu pushen, können Sie ein Docker-Image auch in einer Datei speichern, um es manuell zu übertragen:

docker save -o my-custom-nginx.tar my-custom-nginx:v1

Dieser Befehl speichert das Image in einem Tarball namens my-custom-nginx.tar. Sie können überprüfen, ob die Datei erstellt wurde:

ls -lh my-custom-nginx.tar

Sie sollten eine Ausgabe ähnlich der folgenden sehen:

-rw------- 1 labex labex 142M Nov 10 12:34 my-custom-nginx.tar

Laden eines Images aus einer Datei

Um ein Image von einem Tarball auf einem anderen Rechner (oder demselben Rechner nach dem Entfernen des Images) zu laden, würden Sie Folgendes verwenden:

## Wir werden diesen Befehl nicht tatsächlich als Teil des Tutorials ausführen
## docker load -i my-custom-nginx.tar

Exportieren der Container-Dokumentation

Um anderen zu helfen, Ihr benutzerdefiniertes Image zu verstehen, ist es eine gute Praxis, die von Ihnen vorgenommenen Änderungen zu dokumentieren. Erstellen wir eine einfache Dokumentationsdatei:

cat > my-custom-nginx-doc.txt << EOF
## My Custom Nginx Image

This is a custom Nginx image created by cloning the official Nginx image.

### Changes Made
- Replaced the default welcome page with a custom HTML page

### How to Run
docker run --name my-custom-container -d -p 8080:80 my-custom-nginx:v1

### Version History
- v1: Initial custom version with modified welcome page
EOF

Sie haben jetzt eine Dokumentationsdatei für Ihr benutzerdefiniertes Image.

Herzlichen Glückwunsch! Sie haben gelernt, wie Sie Ihr Docker-Image verschlagworten und für die Freigabe vorbereiten. Im nächsten Schritt werden wir einige Best Practices durchgehen und unsere Umgebung bereinigen.

Best Practices und Bereinigung

In diesem letzten Schritt werden wir einige Best Practices für die Arbeit mit Docker-Images behandeln und unsere Umgebung bereinigen.

Best Practices für Docker-Images

1. Verwenden Sie spezifische Tags

Verwenden Sie immer spezifische Versions-Tags, anstatt sich auf das Tag latest zu verlassen. Dies gewährleistet Konsistenz in Ihren Bereitstellungen.

## Besserer Ansatz
docker pull nginx:1.23.2

## Weniger vorhersehbar
docker pull nginx:latest

2. Halten Sie Images klein

Kleinere Images lassen sich schneller herunterladen und verbrauchen weniger Speicherplatz. Erwägen Sie nach Möglichkeit die Verwendung von Alpine-basierten Images:

## Sehen wir uns den Größenunterschied an
docker pull nginx:alpine
docker images | grep nginx

Sie könnten eine Ausgabe wie diese sehen:

nginx         alpine    2bc7edbc3cf2   2 weeks ago    40.7MB
nginx         latest    605c77e624dd   2 weeks ago    142MB

Die Alpine-Version ist deutlich kleiner!

3. Verwenden Sie Multi-Stage-Builds

Verwenden Sie beim Erstellen von Images mit einem Dockerfile Multi-Stage-Builds, um das endgültige Image klein zu halten. Hier ist ein einfaches Beispiel (Sie müssen dies nicht ausführen):

## Build stage
FROM golang:1.17 AS builder
WORKDIR /app
COPY . .
RUN go build -o app

## Final stage
FROM alpine:3.15
COPY --from=builder /app/app /app
CMD ["/app"]

4. Dokumentieren Sie Ihre Images

Pflegen Sie immer eine Dokumentation für Ihre benutzerdefinierten Images, einschließlich:

  • Wofür das Image gedacht ist
  • Wie man es verwendet
  • Welche Änderungen Sie vorgenommen haben
  • Alle Konfigurationsoptionen

Wir haben im vorherigen Schritt eine einfache Dokumentationsdatei erstellt.

5. Scannen Sie nach Sicherheitslücken

Scannen Sie Ihre Images regelmäßig auf Sicherheitslücken:

## Beispiel für das Scannen (Docker Desktop hat dies integriert)
## docker scan my-custom-nginx:v1

Untersuchen von Docker-Images

Lassen Sie uns einen nützlichen Befehl zum Untersuchen von Docker-Images erkunden:

docker inspect my-custom-nginx:v1

Dieser Befehl zeigt detaillierte Informationen über das Image an, einschließlich seiner Schichten, Konfiguration und Umgebungsvariablen.

Anzeigen des Image-Verlaufs

Sie können den Verlauf der Erstellung eines Images sehen:

docker history my-custom-nginx:v1

Dies zeigt jede Schicht des Images und die Befehle, mit denen sie erstellt wurden.

Bereinigung

Lassen Sie uns nun unsere Umgebung bereinigen, indem wir die von uns erstellten Container und Images entfernen:

  1. Stoppen und entfernen Sie zuerst unseren benutzerdefinierten Container:
docker stop my-custom-container
docker rm my-custom-container
  1. Entfernen Sie die von uns erstellten Images:
docker rmi my-custom-nginx:v1 my-custom-nginx:latest my-custom-nginx:stable
  1. Optional können Sie das Nginx-Image entfernen:
docker rmi nginx:latest nginx:alpine
  1. Überprüfen Sie, ob alle Container und Images entfernt wurden:
docker ps -a
docker images

Verwenden von Docker System Prune

Docker bietet einen praktischen Befehl zum Bereinigen ungenutzter Ressourcen:

docker system prune

Dadurch werden alle gestoppten Container, ungenutzten Netzwerke, hängenden Images und der Build-Cache entfernt. Sie werden vor dem Fortfahren um eine Bestätigung gebeten.

Für eine aggressivere Bereinigung können Sie Folgendes verwenden:

docker system prune -a

Dadurch werden zusätzlich alle ungenutzten Images entfernt, nicht nur die hängenden.

Fazit

Sie haben jetzt gelernt, wie man:

  1. Docker-Images pullt und ausführt
  2. Laufende Container modifiziert
  3. Änderungen committet, um neue benutzerdefinierte Images zu erstellen
  4. Images für Organisation und Verteilung taggt
  5. Images in Dateien speichert, um sie manuell zu übertragen
  6. Ihre benutzerdefinierten Images dokumentiert
  7. Ihre Docker-Umgebung bereinigt

Diese Fähigkeiten bilden die Grundlage für die Arbeit mit Docker-Images und werden für Sie wertvoll sein, wenn Sie Ihre Reise mit der Containerisierung fortsetzen.

Zusammenfassung

In diesem praktischen Tutorial haben Sie den gesamten Prozess des Klonens eines Docker-Container-Images gelernt. Sie begannen mit dem Verständnis der Docker-Grundlagen und der Überprüfung Ihrer Umgebung. Anschließend haben Sie ein offizielles Nginx-Image gepullt und als Container ausgeführt. Als Nächstes haben Sie diesen Container angepasst, indem Sie seinen Inhalt modifiziert und diese Änderungen committet haben, um Ihr eigenes benutzerdefiniertes Image zu erstellen.

Sie haben auch gelernt, wie Sie Ihre Images für die Versionierung und Verteilung richtig taggen, wie Sie Images in Dateien für die manuelle Übertragung speichern und wie Sie Ihre Änderungen dokumentieren. Schließlich haben Sie Best Practices für die Arbeit mit Docker-Images erkundet und Ihre Umgebung bereinigt.

Diese Fähigkeiten bieten eine solide Grundlage für die Arbeit mit Docker in Entwicklungs- und Produktionsumgebungen. Sie können jetzt selbstbewusst Docker-Images erstellen und an Ihre spezifischen Anforderungen anpassen, wodurch Ihre Anwendungen über verschiedene Umgebungen hinweg portabler und konsistenter werden.