【2019年7月実施】Javaフレームワーク「Quarkus」を触ってみた

docker java kubernetes quarkus

今回は、2019年3月7日にRedHatより公開されたJavaフレームワーク「Quarkus」について書きたいと思います。

Quarkus(くぉーかす)とは

ダウンロード.png

・KubernetesネイティブなJavaフレームワーク
・JavaのソースコードをGraalVMを利用してLinuxのネイティブバイナリを作成し、そのバイナリをコンテナ上で起動することにより、起動時間を大幅に短縮することが可能。
・詳しくは、こちらのサイトが網羅していると思います。

本記事の内容

本記事では、公式サイトが公開しているGET STARTEDを実際に行ってみることで
コンテナ起動の早さを体感したいと思います。
※GraalVMの仕組み、Quarkusの詳しい仕様などについては言及しません。

GET STARTED

環境情報

以下の環境を用意しました。
・CentOS7(VirtualBox)
・Maven 3.6.1
・JDK 1.8
・GraalVM Community Edition 19.1.1
・docker 18.09.5

1.テンプレートプロジェクトの作成

以下コマンドを実行し、プロジェクトを作成します。

# mvn io.quarkus:quarkus-maven-plugin:0.19.1:create \
    -DprojectGroupId=org.acme \
    -DprojectArtifactId=getting-started \
    -DclassName="org.acme.quickstart.GreetingResource" \
    -Dpath="/hello"

ここで、プロジェクト構造を見てみます。

プロジェクト構成.png

作成時点でDockerfileが用意されており、プロジェクトビルド後にこのDockerfileでイメージ作成が可能です。
/helloで”hello”が返却される簡単なプログラムですが、動作確認してみましょう。

開発モードが用意されており、以下のコマンドでホットリロードでアプリケーションが起動できます。

# mvn compile quarkus:dev
# curl http://localhost:8080/hello
hello

2.javaのソースコードをビルドしLinuxのネイティブバイナリを作成

ビルドを行う前に、以下設定を行います。

GraalVMの環境変数の設定

GraalVMをダウンロード後、環境変数の設定を行います。

# export GRAALVM_HOME=/opt/graalvm-ce-19.1.1

gcc、glibc、zlib-develのインストール

理由がちゃんとわかっていませんがC言語開発環境が必要(?)なため、
linux環境ではgcc、glibc、zlib-develのインストールが必要です。

# dnf install gcc glibc-devel zlib-devel

native-imageツールのインストール

GraalVM 19.0より、各自でのnative-imageツール(GraalVMの機能の1つ)のインストールが必要になりました。

まずは、guコマンドが打てるようパスを通します。

# export PATH="$PATH:/opt/graalvm-ce-19.1.1/bin"

native-imageツールをインストールします。

# gu install native-image

話が少し逸れますが、GraalVM19.0系は2019年5月1日にリリースされました。
インターネットで検索してヒットする日本語で記載されているQuarkusのGET STARTEDを試した内容の記事のほとんどが、
各自でのnative-imageツールのインストールが必要になった内容を記述していません。

つまり、公式ドキュメントを読まないと気付けません。(寺田先生の記事参考にしながらやったら躓きました。)
公式ドキュメントを読むということは当然のことなんですが、ついつい日本語の記事に逃げてしまいます。よくないですね・・・
その理由がドキュメントが英語で記載されていることなんですが、それを克服するためにも内容がスラスラ読めるレベルの英語力を身に着けたいとひしひしと感じております。
(右クリック>日本語に翻訳(T)の誘惑と戦っております。)

設定が完了したら、ビルドを行います。
と言いたいところですが、ネイティブビルドが可能かどうか以下のコマンドで確認します。

# mvn verify -Pnative
[INFO] Scanning for projects...
[INFO]
[INFO] ----------------------< org.acme:getting-started >----------------------
[INFO] Building getting-started 1.0-SNAPSHOT
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-resources-plugin:2.6:resources (default-resources) @ getting-started ---
[INFO] Using 'UTF-8' encoding to copy filtered resources.
[INFO] Copying 2 resources
~~~~中略~~~~
[INFO] --- maven-failsafe-plugin:2.22.0:verify (default) @ getting-started ---
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  20:12 min
[INFO] Finished at: 2019-07-21T17:41:32+09:00
[INFO] ------------------------------------------------------------------------

ビルドを行います。このコマンドではビルドに失敗した場合、エラーが確認できないので、上記コマンドで確認しましょう。

# package -Pnative -Dnative-image.docker-build=true

ビルド後、成果物ができているか確認しましょう。

# ls -l target/getting-started-1.0-SNAPSHOT-runner

3.Dockerイメージの作成

事前に用意されているDockerfileでイメージを作成します。

# docker build -f src/main/docker/Dockerfile.native -t skakehi/quarkus-getting-started:1.0 .
# docker images
REPOSITORY                                    TAG                 IMAGE ID            CREATED             SIZE
skakehi/quarkus-getting-started               1.0                 7381faecbf7e        23 hours ago        110MB

イメージファイルサイズに注目してみると、約100MB。
モノによりますが、JDKを含むイメージサイズが約300~600MBと比べると随分軽量なことがわかります。

4.Dockerコンテナの起動

イメージが作成できたら、早速起動してみましょう。

# docker run -i --rm -p 8080:8080 skakehi/quarkus-getting-started:1.0
2019-07-21 07:25:32,651 INFO  [io.quarkus] (main) Quarkus 0.19.1 started in 0.002s. Listening on: http://0.0.0.0:8080
2019-07-21 07:25:32,651 INFO  [io.quarkus] (main) Installed features: [cdi, resteasy]

・・・え?もう起動したの??ってレベルで早いです。0.002秒です。

5.動作確認

開発モードの時と確認の方法は一緒ですが、念のため動作確認しましょう。

# curl http://localhost:8080/hello
hello

GET STARTEDは以上です。

おわりに

いかがだったでしょうか。
ここまで早いと何故こんなに早いのかと知りたくなり、GraalVM、さらにいえばJVMの内部構造について少しだけ興味が出てきました。(勉強するとは言っていない)
皆さんも是非実際に動かしてみることで、コンテナ起動の早さを実感してみてください。

参考記事

Quarkus: コンテナ上で Java アプリを高速起動する新しい手法のご紹介
Quarkus入門