Heroku + Docker + Spring Boot

Das Folgende konzentriert sich auf meine Erfahrungen mit der Ausführung der dockerisierten Spring Boot-Anwendung auf den kostenlosen virtuellen Maschinen des Heroku- Clouddienstes. Einer der Hauptvorteile dieses Anbieters besteht darin, dass kostenlose virtuelle Maschinen mit eingeschränkter Arbeitszeit erstellt werden können. Dafür reicht nur die Registrierung aus. Selbst Zahlungsdetails müssen nicht bestätigt werden. Wenn Sie diese jedoch bestätigen, können Sie zusätzliche Boni erhalten. Mehr über ihren Preis können Sie hier lesen. Aus meiner Sicht hat ihre Politik in Bezug auf freie Ressourcen fast keine Analoga.

Nachdem Sie eine Anwendung auf Heroku erstellt haben, gibt es verschiedene Möglichkeiten, Ihren Code darin bereitzustellen

  • Commit im Heroku Git Repository
  • Binden Sie die Anwendung an das Github-Repository
  • Docker Container verwenden

Als nächstes werden wir die letzte dieser Methoden betrachten. Um fortzufahren, benötigen wir die folgenden Anwendungen


Mit dem letzten dieser Tools können wir alle Vorgänge für die Arbeit mit der Cloud über die Befehlszeile ausführen.

Wir beginnen mit der Erstellung einer Spring Boot-Anwendung über Spring Initializr . Fügen Sie als Abhängigkeiten Spring Web Starter hinzu. Es sollte reichen.

In demselben Paket, in dem sich die Hauptklasse der Anwendung befindet, fügen wir die einfachste Klasse des REST-Controllers hinzu, sodass die Anwendung irgendwie Lebenszeichen aufweist.

@RestController public class DemoController { @GetMapping("/check") public String check() { return "Application is alive"; } } 

Zur Datei application.properties hinzufügen

 server.port=${PORT:8080} 

Diese Einstellung ist wichtig, um den Container auf Heroku auszuführen. Tatsache ist, dass im internen Netzwerk des Dienstes die Anwendung zum Zeitpunkt des Starts an einem freien Port gestartet wird, dessen Anzahl über die PORT-Umgebungsvariable übertragen wird. Darüber hinaus muss die Anwendung innerhalb der ersten 60 Sekunden nach dem Start Zeit haben, um eine Verbindung zu diesem Port herzustellen. Andernfalls wird sie gestoppt.

Fügen Sie im Abschnitt " Plugins " der Datei " pom.xml" das Dockerfile-Plugin von Spotify hinzu, das uns bei der Erstellung des Docker-Images unserer Anwendung hilft.

 <plugin> <groupId>com.spotify</groupId> <artifactId>dockerfile-maven-plugin</artifactId> <version>1.4.6</version> <executions> <execution> <id>default</id> <goals> <goal>build</goal> <goal>push</goal> </goals> </execution> </executions> <configuration> <repository>registry.heroku.com/${project.artifactId}/web</repository> <tag>latest</tag> <buildArgs> <JAR_FILE>${project.build.finalName}.jar</JAR_FILE> </buildArgs> </configuration> </plugin> 

Bei einer solchen Plug-In-Konfiguration wird das Image als Teil des Installationsziels erstellt und das Image als Teil des Bereitstellungsziels in das Heroku-Docker-Repository verschoben. Übrigens müssen Sie die Bereitstellung der zusammengestellten JAR-Datei deaktivieren, um Maven Deploy ausführen zu können (wir müssen sie nirgendwo hochladen). Sie können dies mit der Option maven.deploy.skip im Eigenschaftenbereich der Datei pom.xml tun.

 <properties> <java.version>1.8</java.version> <maven.deploy.skip>true</maven.deploy.skip> </properties> 

Erstellen Sie als Nächstes eine Docker-Datei im Stammordner des Projekts (neben pom.xml).

 FROM openjdk:8-jdk-alpine ARG JAR_FILE RUN mkdir -p /apps COPY ./target/${JAR_FILE} /apps/app.jar COPY ./entrypoint.sh /apps/entrypoint.sh RUN chmod +x /apps/entrypoint.sh CMD ["/apps/entrypoint.sh"] 

Wie Sie sehen können, übergeben wir hier den Namen der zusammengestellten JAR-Datei als Argument an die Assembly (ARG JAR_FILE). Der Wert dieses Arguments wird in den Einstellungen des Maven-Plugins festgelegt.

Das Skript entrypoint.sh wird ebenfalls im Stammverzeichnis des Projekts abgelegt und ist sehr einfach.

 #!/usr/bin/env sh /usr/bin/java -XX:+UnlockExperimentalVMOptions -XX:+UseCGroupMemoryLimitForHeap -Xmx256m -Xss512k -XX:MetaspaceSize=100m -jar /apps/app.jar 

Achten Sie auf die speicherbegrenzenden JVM-Parameter und insbesondere auf die ersten beiden Parameter. Sie enthalten einen speziellen Speicherverwaltungsmodus, der erforderlich ist, wenn eine Java-Anwendung im Docker-Container gestartet wird. Der für die Anwendung auf kostenlosen Heroku-Computern verfügbare Speicher ist auf 512 MB begrenzt. Wenn Sie diese Grenze überschreiten, wird die Anwendung beendet. Wenn Sie Java 9+ verwenden möchten, müssen die ersten beiden Optionen durch eine -XX ersetzt werden: + UseContainerSupport . Hier können Sie mehr lesen. Es scheint auch, dass die Containerunterstützung in Java 8 keine experimentelle Funktion mehr ist. Details hier.

Versuchen Sie nach Abschluss dieser Schritte zu starten
 mvnw clean install 

Wenn alles richtig gemacht wurde, sollten die Anwendung und das Docker-Image dafür erstellt werden. Mit dem Befehl können Sie überprüfen, ob das Bild erstellt wurde
 docker images 

Richten wir nun die Cloud ein und verwenden dazu die bereits erwähnte Heroku-CLI. Um diese Schritte ausführen zu können, müssen Sie natürlich ein Konto bei Heroku registrieren.

Zunächst müssen wir uns anmelden. Führen Sie dazu den Befehl aus
 heroku login 
und folgen Sie den Anweisungen unten.

Danach müssen Sie sich beim Heroku Docker-Repository anmelden. Führen Sie dazu den Befehl aus
 heroku container:login 
Ohne dies können wir unser Docker-Image nicht pushen.

Als nächstes erstellen wir die Anwendung mit dem Befehl
 heroku apps:create <app-name> 

Bitte beachten Sie, dass der Anwendungsname mit dem Namen des in pom.xml angegebenen Artefakts übereinstimmen muss. Vielleicht müssen Sie hier einige Zeit damit verbringen, den Namen der Anwendung auszuwählen, die noch von niemandem besetzt ist.

Führen Sie nach dem Erstellen der Anwendung aus
 mvnw clean deploy 

Warten Sie, bis die Anwendung erstellt wurde, und drücken Sie das Docker-Image. Bitte beachten Sie, dass Push nur möglich ist, wenn der Bildname mit der Vorlage registry.heroku.com/<app-name>/web übereinstimmt und eine Anwendung mit dem Namen <app-name> erstellt wurde. Wenn Sie sich die Einstellungen des Maven-Plugins ansehen, werden Sie feststellen, dass alles genau so gemacht wird.

Der letzte Schritt für die Bereitstellung und den Start des Images ist der Befehl
 heroku container:release web --app=<app-name> 

Folgen Sie danach dem Link https: // <App-Name> .herokuapp.com / check und nach einer Weile sehen Sie den Text, der vom Controller-Handler angezeigt wird.

Eine andere Möglichkeit, eine laufende Anwendung in einem Browser zu öffnen, besteht darin, den Befehl zu verwenden
 heroku open --app=<app-name> 

Wenn etwas nicht funktioniert, können Protokolle in der Heroku-Weboberfläche oder mit dem Befehl angezeigt werden
 heroku logs 

Das ist alles! Hoffe, dieser Leitfaden war hilfreich!

Einige nützliche Links


1. Heroku CLI- Dokumentation devcenter.heroku.com/categories/command-line
2. Informationen zu den Funktionen der Speicherverwaltung im dockerisierten Java devcenter.heroku.com/articles/java-memory-issues
3. devcenter.heroku.com/categories/deploying-with-docker
4. Eine Beispiel-Java-Anwendung von Heroku. Es gibt eine andere Bereitstellungsmethode, aber es ist nützlich, unter github.com/heroku/java-getting-started nachzuschauen
5. Herokus Leitfaden zum Starten einer Java-Anwendung (nicht über Docker) devcenter.heroku.com/articles/getting-started-with-java?singlepage=true
6. Gutes Material zur Verwendung von Java unter Docker habr.com/de/company/hh/blog/450954
7. Informationen zu Optionen zum Starten von Java in Docker-Containern www.oracle.com/technetwork/java/javase/8u191-relnotes-5032181.html#JDK-8146115

Source: https://habr.com/ru/post/de459472/


All Articles