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

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

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

このガイドでは、macOSでDockerを使用してJavaアプリケーションをコンテナ化する方法を示します。ghcr.io/graalvm/jdk:ol8-java17を使用します。これは、GraalVM JDKが事前にインストールされているサイズがコンパクトなGraalVM Communityコンテナ・イメージです。Dockerfileが提供されます。

前提条件

サンプル・アプリケーションのノート

デモには、Spring Boot 3 Native Image Microserviceの例を使用します。

  1. GraalVMデモ・リポジトリをクローニングし、アプリケーション・ディレクトリに入ります:

     git clone https://github.com/graalvm/graalvm-demos
     cd spring-native-image
    
  2. ネイティブ実行可能ファイルをビルドし、アプリケーションを実行します:

     mvn -Pnative native:compile
    

    -Pnativeプロファイルは、Mavenを使用したネイティブ実行可能ファイルのビルドを有効にするために使用されます。

    これにより、バイナリ実行可能ファイルtarget/benchmark-jibberが作成されます。これを起動して、アプリケーションの実行を確認します:

     ./target/benchmark-jibber &
     curl http://localhost:8080/jibber
     fg
    

サンプル・アプリケーションのネイティブ実行可能ファイル・バージョン(target/jibber)があり、動作していることを確認したので、次のステップに進むことができます。

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

ネイティブ実行可能ファイルの出力は、プラットフォームに依存します。MacまたはWindowsを使用する場合、ネイティブ実行可能ファイルを含むDockerイメージをビルドするには、Dockerコンテナ内にネイティブ実行可能ファイルをビルドします。そのため、JDKディストリビューションを含むコンテナが必要です。Linuxユーザーの場合、ネイティブ実行可能ファイルをDockerに渡すだけで、アプリケーションがリンクされている静的ライブラリに応じて、最も単純なスリムすなわちdistrolessのコンテナを使用できます。たとえば:

FROM gcr.io/distroless/base
ARG APP_FILE
EXPOSE 8080
COPY target/${APP_FILE} app 
ENTRYPOINT ["/jibber"]

ユーザーの便宜のために、サンプル・アプリケーションにDockerfileが付属しています。

  1. アプリケーション・ルート・フォルダから、次のコマンドを実行してコンテナ内にネイティブ実行可能ファイルを作成し、そのネイティブ実行可能ファイルを含むDockerイメージをビルドします:

     docker build -f Dockerfiles/Dockerfile \
                 --build-arg APP_FILE=./target/jibber \
                 -t localhost/jibber:native.01 .
    

    コンテナにMavenを設定し、残りのジョブを行うには、数分かかります。

  2. Dockerに問い合せて、新しくビルドされたイメージを確認します:
     docker images | head -n2
    

    新しいイメージがリストされます。

  3. イメージを次のように実行します:

     docker run --rm --name native -d -p 8080:8080 localhost/jibber:native.01 
    
  4. 次に、同じコンソール・ウィンドウで、curlコマンドを使用してエンドポイントを呼び出します:

     curl http://localhost:8080/jibber
    

    Jabberwockyの詩のスタイルでナンセンス・バースが表示されます。

ログを参照すると、アプリケーションの起動にかかった時間を確認できます:

docker logs <CONTAINER ID>

Dockerに問い合せて、生成されたコンテナのサイズを取得することもできます:

docker images localhost/jibber:native.01

この違いは、同じSpring Bootアプリケーションで、ネイティブ実行可能ファイルではなくJARファイルを含むDockerイメージをビルドし、イメージの起動時間とファイル・サイズを比較すると、よくわかります。

Linuxでは、コンテナ・サイズをさらに縮小できます。GraalVMネイティブ・イメージを使用すると、ネイティブ実行可能ファイルを空のDockerイメージ(スクラッチ・コンテナとも呼ばれる)に直接パッケージ化することで、静的にリンクされたネイティブ実行可能ファイルをビルドできます。詳細は、静的またはほぼ静的なネイティブ実行可能ファイルのビルドに関するガイドに進んでください。