【2019年7月実施】Javaフレームワーク「Quarkus」を触ってみた
今回は、2019年3月7日にRedHatより公開されたJavaフレームワーク「Quarkus」について書きたいと思います。
Quarkus(くぉーかす)とは

・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"
ここで、プロジェクト構造を見てみます。

作成時点で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の内部構造について少しだけ興味が出てきました。(勉強するとは言っていない)
皆さんも是非実際に動かしてみることで、コンテナ起動の早さを実感してみてください。