ネイティブ実行可能ファイルのコンテナ化およびコンテナでの実行

コンテナは、本番環境に合せた柔軟性のある開発環境を提供して、アプリケーションを分離し、オーバーヘッドを最小限に抑えます。GraalVMネイティブ・イメージで生成された自己完結型の実行可能ファイルの場合、コンテナは明らかなデプロイメント選択肢です。

コンテナベースの開発をサポートするために、プラットフォーム、アーキテクチャ、Javaバージョンおよびエディションに応じて、複数のGraalVMコンテナ・イメージを使用できます:

このガイドでは、Javaアプリケーションのネイティブ実行可能ファイルをコンテナ化する方法を示します。GraalVMコンテナ・イメージをネイティブ・イメージとともに使用して、Javaアプリケーションをネイティブ実行可能ファイルに事前にコンパイルします。

サンプル・アプリケーションのダウンロード

このガイドでは、Spring Boot 3 Native Image Microserviceの例を使用します。この例は、Spring Boot 3上に構築された最小限のRESTベースのAPIアプリケーションです。HTTPエンドポイント/jibberを呼び出すと、Lewis CarrollによってJabberwockyの詩のスタイルで生成されたナンセンス・バースが返されます。

前提条件

GraalVM JDKがインストール済であることを確認します。最も簡単に始めるには、SDKMAN!を使用します。その他のインストール・オプションについては、「ダウンロード」セクションを参照してください。

  1. Rancher DesktopDockerPodmanなどのDocker-API互換コンテナ・ランタイムをインストールして実行します。

  2. GraalVMデモ・リポジトリをクローニングします。
     git clone https://github.com/graalvm/graalvm-demos.git
    
  3. ディレクトリをnative-image/containerize/に変更します:
     cd graalvm-demos/native-image/containerize/spring-boot-microservice-jibber
    

ネイティブ実行可能ファイルとしてのビルドおよび実行

Spring Boot 3のGraalVMネイティブ・イメージの組込みサポートにより、Spring Boot 3アプリケーションをネイティブ実行可能ファイルにコンパイルしやすくなりました。

  1. ネイティブ実行可能ファイルをビルドします:
     ./mvnw native:compile -Pnative
    

    -Pnativeプロファイルは、プラットフォームのネイティブ実行可能ファイルを生成するために使用されます。これにより、benchmark-jibberというネイティブ実行可能ファイルがtarget/ディレクトリに生成されます。

  2. ネイティブ実行可能ファイルを実行し、&を追加してバックグラウンドに配置します。
     ./target/benchmark-jibber &
    
  3. curlを使用してエンドポイントを呼び出します。
     curl http://localhost:8080/jibber
    

    ランダムなナンセンス・バースが表示されます。

  4. fgを使用してアプリケーションをフォアグラウンドに移動し、<CTRL-c>と入力してアプリケーションを停止します。

ネイティブ実行可能ファイルのコンテナ化

生成されたネイティブ実行可能ファイルは、プラットフォームに依存します。

  1. 次のコマンドを使用して、ネイティブ実行可能ファイルをコンテナ化します。

    • 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 .
      
  2. アプリケーションを実行します:
     docker run --rm --name native -p 8080:8080 jibber-benchmark:native.0.0.1-SNAPSHOT
    
  3. 新しいターミナル・ウィンドウから、curlを使用してエンドポイントを呼び出します。
     curl http://localhost:8080/jibber
    

    これにより、ランダムなナンセンス・バースが生成されます。

  4. アプリケーションを停止するには、まずdocker psを使用してコンテナIDを取得し、次を実行します。
     docker rm -f <container_id>
    
  5. コンテナ・イメージを削除するには、まずdocker imagesを使用してイメージIDを取得し、次を実行します。
     docker rmi -f <image_1_id> <image_n_id>
    

サマリー

このガイドでは、GraalVMコンテナ・イメージを使用して、Javaアプリケーションのネイティブ実行可能ファイルをコンテナ化する方法について説明しました。

GraalVMネイティブ・イメージを使用すると、完全に静的なネイティブ実行可能ファイルをビルドして、scratchコンテナやdistrolessコンテナなどの小さなコンテナに直接パッケージ化することもできます。