ネイティブ実行可能ファイルのコンテナ化およびコンテナでの実行
コンテナは、本番環境に合せた柔軟性のある開発環境を提供して、アプリケーションを分離し、オーバーヘッドを最小限に抑えます。GraalVMネイティブ・イメージで生成された自己完結型の実行可能ファイルの場合、コンテナは明らかなデプロイメント選択肢です。
コンテナベースの開発をサポートするために、プラットフォーム、アーキテクチャ、Javaバージョンおよびエディションに応じて、複数のGraalVMコンテナ・イメージを使用できます:
- GraalVM Free Terms and Conditions (GFTC)ライセンスに基づいてOracle Container Registry (OCR)で入手できるOracle GraalVMコンテナ・イメージ。
- GitHubコンテナ・レジストリに公開されるGraalVM Community Editionコンテナ・イメージ。
このガイドでは、Javaアプリケーションのネイティブ実行可能ファイルをコンテナ化する方法を示します。GraalVMコンテナ・イメージをネイティブ・イメージとともに使用して、Javaアプリケーションをネイティブ実行可能ファイルに事前にコンパイルします。
サンプル・アプリケーションのダウンロード
このガイドでは、Spring Boot 3 Native Image Microserviceの例を使用します。この例は、Spring Boot 3上に構築された最小限のRESTベースのAPIアプリケーションです。HTTPエンドポイント/jibber
を呼び出すと、Lewis CarrollによってJabberwockyの詩のスタイルで生成されたナンセンス・バースが返されます。
前提条件
GraalVM JDKがインストール済であることを確認します。最も簡単に始めるには、SDKMAN!を使用します。その他のインストール・オプションについては、「ダウンロード」セクションを参照してください。
-
Rancher Desktop、Docker、PodmanなどのDocker-API互換コンテナ・ランタイムをインストールして実行します。
- GraalVMデモ・リポジトリをクローニングします。
git clone https://github.com/graalvm/graalvm-demos.git
- ディレクトリをnative-image/containerize/に変更します:
cd graalvm-demos/native-image/containerize/spring-boot-microservice-jibber
ネイティブ実行可能ファイルとしてのビルドおよび実行
Spring Boot 3のGraalVMネイティブ・イメージの組込みサポートにより、Spring Boot 3アプリケーションをネイティブ実行可能ファイルにコンパイルしやすくなりました。
- ネイティブ実行可能ファイルをビルドします:
./mvnw native:compile -Pnative
-Pnative
プロファイルは、プラットフォームのネイティブ実行可能ファイルを生成するために使用されます。これにより、benchmark-jibberというネイティブ実行可能ファイルがtarget/ディレクトリに生成されます。 - ネイティブ実行可能ファイルを実行し、
&
を追加してバックグラウンドに配置します。./target/benchmark-jibber &
curl
を使用してエンドポイントを呼び出します。curl http://localhost:8080/jibber
ランダムなナンセンス・バースが表示されます。
fg
を使用してアプリケーションをフォアグラウンドに移動し、<CTRL-c>
と入力してアプリケーションを停止します。
ネイティブ実行可能ファイルのコンテナ化
生成されたネイティブ実行可能ファイルは、プラットフォームに依存します。
-
次のコマンドを使用して、ネイティブ実行可能ファイルをコンテナ化します。
- Linuxでは、前のステップで生成されたネイティブ実行可能ファイルをコンテナ化します:
docker build -f Dockerfiles/Dockerfile.native --build-arg APP_FILE=benchmark-jibber -t jibber-benchmark:native.0.0.1-SNAPSHOT .
- MacOS、WindowsまたはLinuxでは、マルチステージDockerビルドを使用してコンテナ内にネイティブ実行可能ファイルを構築し、ネイティブ実行可能ファイルを軽量コンテナ・イメージにパッケージ化します。
docker build -f Dockerfiles/Dockerfile -t jibber-benchmark:native.0.0.1-SNAPSHOT .
- Linuxでは、前のステップで生成されたネイティブ実行可能ファイルをコンテナ化します:
- アプリケーションを実行します:
docker run --rm --name native -p 8080:8080 jibber-benchmark:native.0.0.1-SNAPSHOT
- 新しいターミナル・ウィンドウから、
curl
を使用してエンドポイントを呼び出します。curl http://localhost:8080/jibber
これにより、ランダムなナンセンス・バースが生成されます。
- アプリケーションを停止するには、まず
docker ps
を使用してコンテナIDを取得し、次を実行します。docker rm -f <container_id>
- コンテナ・イメージを削除するには、まず
docker images
を使用してイメージIDを取得し、次を実行します。docker rmi -f <image_1_id> <image_n_id>
サマリー
このガイドでは、GraalVMコンテナ・イメージを使用して、Javaアプリケーションのネイティブ実行可能ファイルをコンテナ化する方法について説明しました。
GraalVMネイティブ・イメージを使用すると、完全に静的なネイティブ実行可能ファイルをビルドして、scratchコンテナやdistrolessコンテナなどの小さなコンテナに直接パッケージ化することもできます。