Docker und Java: Containerisierung von Anwendungen von A bis Z

Online Python-Trainer für Anfänger

Lernen Sie Python einfach ohne theoretische Überlastung. Lösen Sie praktische Aufgaben mit automatischer Überprüfung und schreiben Sie Code direkt im Browser.

Kurs starten

Einleitung: Warum ist Docker für Java-Entwickler wichtig?



Moderne Java-Entwicklung kommt selten ohne Containerisierung aus. Docker ermöglicht es, eine Anwendung zusammen mit allen Abhängigkeiten, der JVM und der Konfiguration in einen isolierten Container zu packen. Dies löst das Problem „es funktioniert auf meinem Rechner“ und vereinfacht CI/CD. In diesem Artikel werden wir den gesamten Zyklus durchgehen: von der Installation von Docker bis zur Optimierung von Images für die Produktion.



1. Grundlagen von Docker für Java



1.1 Was ist Docker und warum wird es für Java-Projekte benötigt?



Docker ist eine Plattform zum Erstellen, Bereitstellen und Ausführen von Anwendungen in Containern. Für Java ist dies besonders relevant:

  • Isolation von JVM-Versionen – Sie können Java 11 für einen Dienst und Java 17 für einen anderen auf demselben Host verwenden.
  • Reproduzierbarkeit – Das Image enthält die genaue Version des JDK, der Bibliotheken und der Systemdienstprogramme.
  • Skalierung – Einfaches Ausführen mehrerer Instanzen über Kubernetes oder Docker Swarm.


1.2 Installation von Docker



Installieren Sie zunächst Docker Desktop (Windows/Mac) oder Docker Engine (Linux). Überprüfen Sie die Installation:



docker --versiondocker info


2. Erstellen eines Dockerfiles für eine Java-Anwendung



Betrachten wir eine einfache Spring Boot-Anwendung. Erstellen Sie eine Datei Dockerfile im Stammverzeichnis des Projekts.



2.1 Basis-Dockerfile



# Verwenden des offiziellen OpenJDK-ImagesFROM openjdk:17-jdk-alpine

# Arbeitsverzeichnis festlegenWORKDIR /app

# JAR-Datei kopierenCOPY target/myapp.jar app.jar

# Port freigebenEXPOSE 8080

# StartbefehlENTRYPOINT ["java", "-jar", "app.jar"]


2.2 Erstellen und Ausführen des Containers



# Image erstellendocker build -t my-java-app .

# Container ausführendocker run -p 8080:8080 my-java-app


Nach dem Start ist die Anwendung unter http://localhost:8080 erreichbar.



3. Optimierung von Docker-Images für Java



Große Images verlangsamen die Bereitstellung. Betrachten wir die wichtigsten Optimierungstechniken.



3.1 Mehrstufige Builds (Multi-stage builds)



Ermöglicht die Trennung von Build- und Ausführungsphase. In das endgültige Image gelangt nur das JAR, ohne Maven/Gradle und Quellcode.



# Build-PhaseFROM maven:3.8.5-openjdk-17 AS buildWORKDIR /appCOPY pom.xml .RUN mvn dependency:go-offlineCOPY src ./srcRUN mvn package -DskipTests

# AusführungsphaseFROM openjdk:17-jdk-alpineWORKDIR /appCOPY --from=build /app/target/myapp.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]


3.2 Layer-Optimierung



Docker cached Layer. Trennen Sie das Kopieren von Daten: zuerst Abhängigkeiten (ändern sich selten), dann Code (ändert sich häufig).



FROM maven:3.8.5-openjdk-17 AS buildWORKDIR /app# Nur POM kopieren und Abhängigkeiten herunterladenCOPY pom.xml .RUN mvn dependency:go-offline# Quellcode kopieren und bauenCOPY src ./srcRUN mvn package -DskipTests

FROM openjdk:17-jdk-alpineWORKDIR /appCOPY --from=build /app/target/*.jar app.jarEXPOSE 8080ENTRYPOINT ["java", "-jar", "app.jar"]


3.3 Verwendung von jlink zur Erstellung einer minimalen JRE



Wenn Sie Java 9+ verwenden, können Sie eine benutzerdefinierte JRE nur mit den benötigten Modulen erstellen.



FROM openjdk:17-slim AS jre-buildRUN jlink --add-modules java.base,java.logging,java.sql \          --output /jre \          --strip-debug \          --no-man-pages \          --no-header-files

FROM alpine:latestCOPY --from=jre-build /jre /jreCOPY target/app.jar /app.jarENTRYPOINT ["/jre/bin/java", "-jar", "/app.jar"]


Ein solches Image kann weniger als 50 MB wiegen, statt 300+ MB.



4. Docker Compose für Java-Mikroservices



Wenn Sie mehrere Dienste haben (z. B. Spring Boot + PostgreSQL), verwenden Sie docker-compose.yml.



4.1 Pr

Blogs

Buchempfehlungen