Fortgeschrittene Docker-Techniken
Multi-Stage-Build-Strategien
Multi-Stage-Builds sind ein leistungsstarkes Feature, das es Ihnen ermöglicht, mehrere FROM
-Anweisungen in Ihrem Dockerfile zu verwenden. Jede FROM
-Anweisung kann ein anderes Basisimage verwenden, und jede FROM
-Anweisung startet eine neue Build-Phase. Dies hilft bei der Optimierung der Komplexität von Dockerfiles und der Reduzierung der endgültigen Image-Größe, indem Build- und Laufzeitumgebungen getrennt werden.
graph TD
A[Build-Phase] --> B[Kompilieren/Bauen]
B --> C[Laufzeit-Phase]
C --> D[Minimales Produktions-Image]
Vorbereitung für einen Multi-Stage-Build
Für dieses Beispiel simulieren wir eine einfache Anwendung, die einen Build-Schritt erfordert. Wir erstellen eine build_script.sh
und eine final_app.txt
-Datei.
Stellen Sie zunächst sicher, dass Sie sich im Verzeichnis docker_app
befinden:
cd /home/labex/project/docker_app
Erstellen Sie nun ein einfaches Build-Skript:
nano build_script.sh
Fügen Sie den folgenden Inhalt in build_script.sh
ein:
#!/bin/bash
echo "Running build process..."
echo "This is the final application output." > /app/output/final_app.txt
echo "Build complete."
Speichern Sie die Datei (Strg+S
) und beenden Sie (Strg+X
).
Erstellen Sie als Nächstes einen Platzhalter für den Inhalt unserer endgültigen Anwendung. In einem realen Szenario würde dies durch den Build-Prozess generiert werden.
nano final_app.txt
Fügen Sie den folgenden Inhalt in final_app.txt
ein:
This is a placeholder for the final application.
Speichern Sie die Datei (Strg+S
) und beenden Sie (Strg+X
).
Implementierung eines Multi-Stage-Dockerfiles
Ändern wir nun unser Dockerfile
, um einen Multi-Stage-Build zu verwenden. Wir werden eine "Builder"-Phase haben, die unser build_script.sh
ausführt, und dann eine "Produktions"-Phase, die nur die notwendigen Ausgaben aus der Builder-Phase kopiert.
nano Dockerfile
Ersetzen Sie den vorhandenen Inhalt durch Folgendes:
## Phase 1: Builder-Phase
FROM ubuntu:22.04 AS builder
## Bash installieren, um das Skript auszuführen
RUN apt-get update && apt-get install -y bash
## Arbeitsverzeichnis für die Builder-Phase festlegen
WORKDIR /build
## Build-Skript kopieren und ausführbar machen
COPY build_script.sh .
RUN chmod +x build_script.sh
## Verzeichnis für die Ausgabe erstellen
RUN mkdir -p /build/output
## Build-Skript ausführen
RUN ./build_script.sh
## Phase 2: Produktions-Phase
FROM ubuntu:22.04
## Arbeitsverzeichnis für die Produktions-Phase festlegen
WORKDIR /app
## Nur das notwendige Artefakt aus der Builder-Phase kopieren
COPY --from=builder /build/output/final_app.txt .
## Befehl, der beim Start des Containers ausgeführt wird
CMD ["cat", "final_app.txt"]
FROM ubuntu:22.04 AS builder
: Dies startet die erste Phase und benennt sie builder
.
RUN apt-get update && apt-get install -y bash
: Installiert bash
in der Builder-Phase, was zur Ausführung unseres Skripts benötigt wird.
WORKDIR /build
: Legt das Arbeitsverzeichnis für die Builder-Phase fest.
COPY build_script.sh .
: Kopiert unser Build-Skript in die Builder-Phase.
RUN chmod +x build_script.sh
: Macht das Skript ausführbar.
RUN mkdir -p /build/output
: Erstellt ein Ausgabeverzeichnis in der Builder-Phase.
RUN ./build_script.sh
: Führt das Build-Skript aus, das final_app.txt
in /build/output
generiert.
FROM ubuntu:22.04
: Dies startet die zweite Phase (die Produktions-Phase). Sie verwendet ein frisches ubuntu:22.04
-Image, was bedeutet, dass sie standardmäßig nichts von der builder
-Phase erbt.
WORKDIR /app
: Legt das Arbeitsverzeichnis für die Produktions-Phase fest.
COPY --from=builder /build/output/final_app.txt .
: Dies ist die entscheidende Anweisung für Multi-Stage-Builds. Sie kopiert final_app.txt
aus dem Verzeichnis /build/output
der builder
-Phase in das aktuelle Verzeichnis (/app
) der Produktions-Phase. Dies stellt sicher, dass nur das endgültige Artefakt enthalten ist, wodurch das Produktions-Image klein bleibt.
CMD ["cat", "final_app.txt"]
: Der Befehl, der beim Start des Produktionscontainers ausgeführt wird und den Inhalt der kopierten Datei anzeigt.
Speichern Sie die Datei (Strg+S
) und beenden Sie (Strg+X
).
Erstellen und Ausführen des Multi-Stage-Images
Erstellen wir nun das neue Image mit unserem Multi-Stage-Dockerfile.
docker build -t multi-stage-app .
Beobachten Sie die Build-Ausgabe. Sie sehen Schritte sowohl für die builder
-Phase als auch für die endgültige Phase.
Nachdem der Build abgeschlossen ist, führen Sie den Container aus, um zu überprüfen, ob der Inhalt von final_app.txt
angezeigt wird.
docker run multi-stage-app
Sie sollten "This is the final application output." sehen, was bestätigt, dass der Multi-Stage-Build das Artefakt erfolgreich von der Build-Phase in das endgültige Image kopiert hat.
Bereinigung von Docker-Ressourcen
Es ist eine gute Praxis, nicht mehr benötigte Docker-Ressourcen (Container und Images) zu bereinigen, um Speicherplatz freizugeben.
Listen Sie zunächst alle Container auf (einschließlich beendeter):
docker ps -a
Sie können bestimmte Container anhand ihrer ID oder ihres Namens entfernen:
docker rm $(docker ps -aq)
Dieser Befehl entfernt alle beendeten Container. docker ps -aq
listet alle Container-IDs auf, und docker rm
entfernt sie.
Listen Sie als Nächstes alle Images auf:
docker images
Sie können bestimmte Images anhand ihrer ID oder ihres Namens entfernen. Seien Sie vorsichtig, keine Images zu entfernen, die noch von laufenden Containern verwendet werden.
docker rmi my-ubuntu-app multi-stage-app hello-world ubuntu:22.04
Dieser Befehl entfernt die Images, die wir in diesem Lab erstellt und verwendet haben. Wenn ein Image noch von einem Container verwendet wird, müssen Sie zuerst den Container entfernen.
docker images
Dieser Befehl zeigt an, dass die Images entfernt wurden.
Damit ist das Lab zu Docker-Grundlagen und fortgeschrittenen Techniken abgeschlossen. Sie haben gelernt, wie man Dockerfiles erstellt, Images baut, Container ausführt und die Image-Größe mit Multi-Stage-Builds optimiert.