Mehrstufige Dockerfiles für die Verpackung von Java EE-Anwendungen

DockerDockerBeginner
Jetzt üben

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

Einführung

Die mehrstufigen Dockerfiles von Docker bieten eine leistungsstarke Lösung zur Optimierung des Verpackungsprozesses von Java EE-Anwendungen. Dieses Tutorial führt Sie durch die Schritte zum Erstellen und Optimieren Ihrer Java EE-App mit einem mehrstufigen Dockerfile, um eine effiziente Bereitstellung und Verteilung sicherzustellen.

Mehrstufige Dockerfiles verstehen

Mehrstufige Dockerfiles sind eine leistungsstarke Funktion, die in Docker 17.05 eingeführt wurde. Sie ermöglichen die Erstellung optimierter Docker-Images durch die Verwendung mehrerer Phasen in einem einzigen Dockerfile. Dieser Ansatz hilft, die Größe des endgültigen Images zu reduzieren und den Build-Prozess zu verbessern, indem die Build-Umgebung von der Laufzeitumgebung getrennt wird.

Was ist ein mehrstufiges Dockerfile?

Ein mehrstufiges Dockerfile ist ein Dockerfile, das mehrere FROM-Anweisungen enthält, die jeweils eine andere Phase im Build-Prozess darstellen. Jede Phase kann ein anderes Basis-Image verwenden, und die letzte Phase wird verwendet, um das endgültige Docker-Image zu erstellen.

graph TD A[Basis-Image] --> B[Build-Phase] B --> C[Laufzeit-Phase] C --> D[Endgültiges Image]

Vorteile der Verwendung mehrstufiger Dockerfiles

  1. Reduzierte Imagegröße: Durch die Trennung der Build-Umgebung von der Laufzeitumgebung können Sie ein kleineres endgültiges Docker-Image erstellen, das nur die notwendigen Komponenten für den Betrieb Ihrer Anwendung enthält.
  2. Verbesserter Build-Prozess: Mehrstufige Dockerfiles können den Build-Prozess vereinfachen, indem Sie verschiedene Basis-Images für verschiedene Phasen verwenden, wodurch die Notwendigkeit komplexer Build-Skripte oder separater Dockerfiles reduziert wird.
  3. Erhöhte Sicherheit: Durch die Reduzierung der Größe des endgültigen Images können Sie die Angriffsfläche minimieren und das Risiko von Sicherheitslücken verringern.

Verwendung mehrstufiger Dockerfiles

Um ein mehrstufiges Dockerfile zu verwenden, müssen Sie mehrere FROM-Anweisungen in Ihrem Dockerfile definieren, die jeweils eine andere Phase darstellen. Die letzte Phase wird verwendet, um das endgültige Docker-Image zu erstellen.

## Build-Phase
FROM maven:3.8.2-openjdk-11 AS build
COPY . /app
WORKDIR /app
RUN mvn clean package

## Laufzeit-Phase
FROM openjdk:11-jdk-slim
COPY --from=build /app/target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

In diesem Beispiel verwendet die erste Phase das maven:3.8.2-openjdk-11-Image, um die Java EE-Anwendung zu erstellen, und die zweite Phase verwendet das openjdk:11-jdk-slim-Image, um das endgültige Docker-Image zu erstellen, das nur die notwendigen Laufzeitkomponenten enthält.

Erstellen einer Java EE-App mit mehrstufigen Dockerfiles

In diesem Abschnitt werden wir den Prozess des Erstellens einer Java EE-Anwendung mithilfe eines mehrstufigen Dockerfiles erläutern.

Vorbereitung der Java EE-Anwendung

Nehmen wir an, Sie haben eine Java EE-Anwendung, die Sie mit einem mehrstufigen Dockerfile verpacken möchten. Die Anwendung ist wie folgt strukturiert:

my-java-ee-app/
├── pom.xml
└── src/
    ├── main/
    │   ├── java/
    │   │   └── com/
    │   │       └── example/
    │   │           └── MyApp.java
    │   └── webapp/
    │       └── WEB-INF/
    │           └── web.xml
    └── test/
        └── java/
            └── com/
                └── example/
                    └── MyAppTest.java

Erstellen des mehrstufigen Dockerfiles

Hier ist ein Beispiel für ein mehrstufiges Dockerfile zum Erstellen und Verpacken der Java EE-Anwendung:

## Build-Phase
FROM maven:3.8.2-openjdk-11 AS build
COPY . /app
WORKDIR /app
RUN mvn clean package

## Laufzeit-Phase
FROM tomcat:9.0-jdk11-openjdk-slim
COPY --from=build /app/target/*.war /usr/local/tomcat/webapps/app.war

In diesem Dockerfile gibt es zwei Phasen:

  1. Build-Phase: Diese Phase verwendet das maven:3.8.2-openjdk-11-Image, um die Java EE-Anwendung zu erstellen. Die Befehle COPY und RUN werden verwendet, um den Anwendungsquellcode zu kopieren und die Anwendung mithilfe von Maven zu erstellen.
  2. Laufzeit-Phase: Diese Phase verwendet das tomcat:9.0-jdk11-openjdk-slim-Image als Basis-Image. Der Befehl COPY --from=build wird verwendet, um die erstellte WAR-Datei aus der vorherigen Phase in das Tomcat-Webapps-Verzeichnis zu kopieren.

Erstellen und Ausführen des Docker-Images

Um das Docker-Image zu erstellen, führen Sie den folgenden Befehl im Verzeichnis aus, das das Dockerfile enthält:

docker build -t my-java-ee-app .

Sobald das Image erstellt wurde, können Sie den Container ausführen:

docker run -p 8080:8080 my-java-ee-app

Dies startet den Tomcat-Server und deployt die Java EE-Anwendung. Sie können die Anwendung dann unter http://localhost:8080/app aufrufen.

Optimierung mehrstufiger Dockerfiles für Java EE-Apps

Beim Erstellen von Java EE-Anwendungen mit mehrstufigen Dockerfiles gibt es verschiedene Optimierungsmethoden, um die Größe des endgültigen Docker-Images zu reduzieren und den Build-Prozess zu verbessern.

Nutzung von Build-Abhängigkeiten

Eine gängige Optimierung besteht darin, Build-Abhängigkeiten nur in der Build-Phase zu verwenden und sie von der endgültigen Laufzeitphase auszuschließen. Sie können beispielsweise ein separates Build-Image verwenden, das alle notwendigen Build-Tools wie ein Maven- oder Gradle-Image enthält, und dann die erstellten Artefakte in ein kleineres Laufzeit-Image kopieren.

## Build-Phase
FROM maven:3.8.2-openjdk-11 AS build
COPY . /app
WORKDIR /app
RUN mvn clean package

## Laufzeit-Phase
FROM openjdk:11-jdk-slim
COPY --from=build /app/target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

Verwendung des mehrstufigen Cache

Die mehrstufige Build-Funktion von Docker ermöglicht es Ihnen auch, den Build-Cache zu nutzen, um nachfolgende Builds zu beschleunigen. Durch eine Organisation Ihres Dockerfiles, die die Wiederverwendung des Cache maximiert, können Sie die Build-Zeit deutlich reduzieren.

## Basis-Phase
FROM maven:3.8.2-openjdk-11 AS base
WORKDIR /app

## Abhängigkeiten kopieren
COPY pom.xml .
RUN mvn dependency:go-offline

## Build-Phase
FROM base AS build
COPY . .
RUN mvn clean package

## Laufzeit-Phase
FROM openjdk:11-jdk-slim
COPY --from=build /app/target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

In diesem Beispiel wird die Datei pom.xml kopiert und die Abhängigkeiten in der Basis-Phase heruntergeladen. Dadurch wird sichergestellt, dass der Schritt der Abhängigkeitsauflösung im Cache gespeichert wird, was nachfolgende Builds beschleunigt.

Optimierung des Laufzeit-Images

Eine weitere Optimierungsmethode besteht darin, ein kleineres Basis-Image für die Laufzeitphase zu verwenden. Sie können beispielsweise das openjdk:11-jdk-slim-Image anstelle des vollständigen openjdk:11-jdk-Images verwenden, was die Größe des endgültigen Images erheblich reduzieren kann.

## Laufzeit-Phase
FROM openjdk:11-jdk-slim
COPY --from=build /app/target/*.jar app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]

Zusätzlich können Sie Techniken wie mehrstufige Builds, Alpine-basierte Images oder distroless-Images verwenden, um die Größe des Laufzeit-Images weiter zu optimieren.

Durch die Anwendung dieser Optimierungsmethoden können Sie hochoptimierte Docker-Images für Ihre Java EE-Anwendungen erstellen, die die Imagegröße reduzieren und den Build-Prozess verbessern.

Zusammenfassung

Am Ende dieses Tutorials verfügen Sie über ein fundiertes Verständnis der effektiven Verwendung mehrstufiger Dockerfiles zur Verpackung Ihrer Java EE-Anwendungen. Sie lernen Techniken zur Optimierung des Build-Prozesses, zur Reduzierung der Imagegröße und zur Erstellung einer zuverlässigen und reproduzierbaren Deployment-Pipeline mithilfe von Docker. Dieses Wissen ermöglicht es Ihnen, die Effizienz und Skalierbarkeit Ihrer Java EE-Applikationsbereitstellungen zu verbessern.