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

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

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

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

サンプル・アプリケーション

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

前提条件

  1. ダウンロードから最新のOracle GraalVMをダウンロードしてインストールします。最も簡単なオプションは、SDKMAN!を使用することです。次のコマンドを実行して、Oracle GraalVM for JDK 17をインストールします:

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

  3. GraalVMデモ・リポジトリをクローニングします。

     git clone https://github.com/graalvm/graalvm-demos
    
  4. ディレクトリをデモ・ディレクトリに変更します。

     cd spring-native-image
    

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

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

  1. ネイティブ実行可能ファイルをビルドします:

     ./mvnw native:compile -Pnative
    

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

  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ネイティブ・イメージを使用すると、ネイティブ実行可能ファイルをスクラッチ・イメージやdistrolessイメージなどの小さなコンテナに直接パッケージ化することで、静的にリンクされたネイティブ実行可能ファイルを構築できます。詳細は、静的またはほぼ静的なネイティブ実行可能ファイルのビルドに関するガイドに進んでください。