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.
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-line2. Informationen zu den Funktionen der Speicherverwaltung im dockerisierten Java
devcenter.heroku.com/articles/java-memory-issues3.
devcenter.heroku.com/categories/deploying-with-docker4. Eine Beispiel-Java-Anwendung von Heroku. Es gibt eine andere Bereitstellungsmethode, aber es ist nützlich, unter
github.com/heroku/java-getting-started nachzuschauen5. Herokus Leitfaden zum Starten einer Java-Anwendung (nicht über Docker)
devcenter.heroku.com/articles/getting-started-with-java?singlepage=true6. Gutes Material zur Verwendung von Java unter Docker
habr.com/de/company/hh/blog/4509547.
Informationen zu Optionen zum Starten von Java in Docker-Containern
www.oracle.com/technetwork/java/javase/8u191-relnotes-5032181.html#JDK-8146115