Dockerisieren einer Spring Boot-App mit Googles Fock

Bild 1: Reibungslose Java Docker-Bilder mit Jib!

Hallo! Als ich vor kurzem auf einer Spring-basierten Plattform gearbeitet habe, habe ich überlegt, wie ich einen Microservice andocken soll. Also bin ich auf Jib gestoßen, einen ziemlich neuen Ansatz, der von Google entwickelt wurde.

In diesem Beitrag geht es um die Verwendung von Jib und insbesondere des Jib-Maven-Plugins zum Erstellen einer Anwendung für containerisierte Springboots.

Das in diesem Beitrag verwendete Demo-Projekt finden Sie hier:

Was ist Fock?

Mit Jib können Sie einen Container erstellen, indem Sie einfach ein Plugin zum Build-Tool Ihrer Wahl (Maven oder Gradle) hinzufügen. Keine zusätzlichen Dateien, nur ein paar Konfigurationszeilen. Alle Schritte zum Packen Ihrer Anwendung in ein Container-Image werden ausgeführt.

Mit den eigenen Worten des Google Cloud-Teams:

Jib ist ein Open-Source-Java-Containerizer von Google, mit dem Java-Entwickler Container mit den ihnen bekannten Java-Tools erstellen können. Es ist nicht erforderlich, dass Sie eine Docker-Datei schreiben oder Docker installiert haben, und es ist direkt in Maven und Gradle integriert.

Im "traditionellen" Ablauf der Java-Docker-Image-Erstellung müssen eine Docker-Datei und der Docker-Dämon installiert sein, wie unten gezeigt:

Image 2: Die herkömmlichen Schritte zum Erstellen eines Docker-Images aus einer Java-App.

Wie aus dem Diagramm hervorgeht, benötigen Sie im Jib-Erstellungsablauf nur das Plugin für die Erstellungsdatei des Projekts:

Bild 3: Die Jib-Methode zum Erstellen eines Docker-Bildes aus einer Java-App.

Installieren

Es gehört nicht zum Umfang dieses Beitrags, eine Java-Entwicklungsumgebung einzurichten, aber probieren wir es aus!

  1. Stellen Sie sicher, dass Java 8+ installiert ist.
  2. Wir werden maven verwenden, falls nicht vorhanden, installieren Sie maven 3.5+.
  3. Stellen Sie sicher, dass Sie Docker installiert haben, und wenn Sie Linux verwenden, hat Ihr Benutzer Docker-Zugriff.
  4. Haben Sie Ihre Lieblings-IDE installiert (Eclipse oder Idee).

Erstellen Sie eine einfache Spring Boot-Anwendung

Dies kann entweder über spring initializr oder über Ihre bevorzugte IDE erfolgen. Wenn Sie den Spring-Initializer verwendet haben, müssen Sie das neu erstellte Maven-Projekt in Ihre IDE importieren (Eclipse / Idea).

Füge jib-maven-plugin zu deiner pom.xml hinzu

Um ein sehr einfaches, lokal gespeichertes Image Ihrer App zu erhalten, konfigurieren Sie das Jib-Maven-Plugin in Ihrer pom.xml wie folgt:

Kompilieren Sie die App und erstellen Sie das Image

Jetzt können wir die Anwendung erstellen und prüfen, ob das Image in unserem lokalen Docker-Repository erstellt wurde.

Wechseln Sie über ein Terminal in den Stammordner des Projekts und führen Sie Folgendes aus:

mvn compile jib: dockerBuild

Maven-Erstellungsprotokolle sollten folgende Zeilen enthalten:

[INFO] - - jib-maven-plugin: 0.10.1: dockerBuild (default-cli) @ spring-boot-jib - -
[INFO]
[INFO] Containeranwendung für Docker-Daemon als springbootjib…
[WARNUNG] Das Basis-Image "gcr.io/distroless/java" verwendet keinen bestimmten Image-Digest - Build ist möglicherweise nicht reproduzierbar
[INFO] Basis-Image abrufen gcr.io/distroless/java…
[INFO] Gebäudeabhängigkeitsebene…
[INFO] Gebäuderessourcenschicht…
[INFO] Gebäudeklassenebene…
[INFO] Finalisieren…
[INFO]
[INFO] Container-Eintrittspunkt auf [Java, -cp, / app / Ressourcen: / app / Klassen: / app / libs / *, com.jibdemo.SpringBootJibApplication] gesetzt
[INFO] Wird in Docker-Daemon geladen ...
[INFO]
[INFO] Erstellt ein Image für den Docker-Daemon als springbootjib

Solange es keine Fehler gibt und wir den Maven "Built Image to Docker Daemon as springbootjib" sehen, sind wir alle bereit.

Führen Sie das Docker-Image aus

Zu diesem Zeitpunkt sollten wir das neue Docker-Image in unserem lokalen Repository haben. Wir können dies überprüfen, indem wir das Docker-Image ls ausführen, und wir sollten ein Bild ähnlich dem folgenden sehen:

springbootjib letzte eb4bea693650 vor 3 Stunden 135MB

Beachten Sie die sehr kleine Bildgröße (135 MB), die auf das von Jib standardmäßig verwendete Image gcr.io/distroless/java zurückzuführen ist (wir werden später sehen, wie wir das ändern können).

Jetzt können wir das Image wie gewohnt ausführen, indem wir docker run -it springbootjib eingeben und sicherstellen, dass die App wie erwartet ausgeführt wird.

Konfigurieren des Jib-Plugins zur Feinabstimmung unseres Docker-Images

Wir können tiefer gehen und das Jib-Plugin weiter konfigurieren, um verschiedene gängige Szenarien zu berücksichtigen, z.

Zum Beispiel in der folgenden Konfiguration das Bild:

  • Wird von einer Basis von openjdk gebaut: alpine (gezogen von Docker Hub)
  • Wird an localhost: 5000 / springbootjib: 0.0.1-SNAPSHOT, localhost: 5000 / springbootjib: alpine und localhost: 5000 / springbootjib: latest gesendet
  • Wird ausgeführt, indem Java -Xms256m -Xdebug -cp app / libs / *: app / resources: app / classes com.jibdemo.SpringBootJibApplication mit einigen Argumenten aufgerufen wird
  • Macht Port 8001 für tcp (Standard) und die Ports 8002 und 8003 für udp verfügbar
  • Hat ein Etikett (Name: springbootjib)
  • Wird als OCI-Format erstellt

Jetzt können Sie das Image erneut erstellen und den Unterschied in den Maven-Protokollen feststellen:

[INFO] --- jib-maven-plugin: 0.10.1: dockerBuild (default-cli) @ spring-boot-jib ---
[INFO]
[INFO] Containeranwendung für Docker-Daemon als localhost: 5000 / springbootjib: 0.0.1-SNAPSHOT, localhost: 5000 / springbootjib: alpine, localhost: 5000 / springbootjib ...
[INFO] Basisbild abrufen openjdk: alpine ...
[INFO] Ebene "Abhängigkeiten erstellen" ...
[INFO] Gebäuderessourcenebene ...
[INFO] Gebäudeklassenebene ...
[INFO] Für das Basisimage ist eine Authentifizierung erforderlich. Ich versuche es erneut mit openjdk: alpine ...
[INFO] Registrierungsdaten für registry.hub.docker.com werden abgerufen ...
[INFO] Finalisierung ...
[INFO]
[INFO] Container-Eintrittspunkt auf [java, -Xms256m, -Xdebug, -cp, / app / resources: / app / classes: / app / libs / *, com.jibdemo.SpringBootJibApplication] gesetzt
[INFO] Wird in Docker-Daemon geladen ...
[INFO]
[INFO] Erstelltes Image für den Docker-Daemon als localhost: 5000 / springbootjib: 0.0.1-SNAPSHOT, localhost: 5000 / springbootjib: alpine, localhost: 5000 / springbootjib

Beachten Sie im obigen Protokollsegment, dass das Plugin das Image openjdk: alpine von Docker Hub abgerufen, das Image in drei Versionen mit unterschiedlichen Tags erstellt und in unserem lokalen Repository gespeichert hat.

Warum ich mit Jib geschossen habe

  • Sie müssen keine Docker-Datei verwalten, keinen Docker-Daemon ausführen oder sich sogar Gedanken über das Erstellen einer fetten JAR mit all ihren Abhängigkeiten machen.
  • Nutzt Image-Layering und Registry-Caching, um schnelle, inkrementelle Builds zu erzielen.
  • Kann so konfiguriert werden, dass reproduzierbare Build-Images erstellt werden, solange Ihre Eingaben gleich bleiben.

Fazit

Nachdem ich andere Maven-Plug-ins wie die von spotify und fabric8 verwendet habe, um Docker-Images für Java-Apps zu erstellen, begrüße ich die Übernahme durch Google. Es benötigt weniger Dateien als das Plugin von fabric8 und fühlt sich (meiner bescheidenen Meinung nach) einfacher zu konfigurieren an als das Plugin von spotify. Ich empfehle es auf jeden Fall auszuprobieren!

Haftungsausschluss: Dies ist kein Vergleichsartikel, nur meine Sicht auf die Angelegenheit aus eigener Erfahrung.

Sie können immer mehr über Jibs Github-Repo lesen, das ausführliche Informationen zu allen Konfigurationsparametern enthält. Vielen Dank fürs Lesen! Ich hoffe, dass es Ihnen gefallen hat! Fühlen Sie sich frei, Ihr Feedback hier zu hinterlassen.

Über mich

Hey, danke fürs vorbeischauen. Ich bin ein unabhängiger Full-Stack-Ingenieur mit Schwerpunkt Back-End und DevOps. Ich möchte Prototypen / MVPs erstellen und Plattformen entwickeln, die sich in der Cloud skalieren lassen.

Sie können hier mehr über mich und meine Geschichte lesen. Wenn Sie geschäftliche Angelegenheiten besprechen oder einfach Kontakt aufnehmen möchten, senden Sie mir eine E-Mail: tasos.tsaousis@codedlines.com.