QUARKUS で作る爆速 Java Micro Service #3
Docker コンテナ用にビルド
以下のコマンドを投入して Docker コンテナ内で起動するためのバイナリ (Linux) を生成します。
$ ./mvnw clean package -Pnative -Dnative-image.docker-build=true
もし、コマンドの途中で OutOfMemory エラーが発生するような場合は、Docker のメモリの上限をあげることで解消されます。
以下のバイナリが生成されました。
$ ls -l ./target/quarkus-samples-1.0-SNAPSHOT-runner
-rwxr-xr-x 1 kkosugi staff 19399648 9 27 10:05 ./target/quarkus-samples-1.0-SNAPSHOT-runner
file コマンドでファイルの詳細をみてみると、ELF 64-bit LSB Executable となっているのが確認できます。前回は MacOS 用の実行ファイルでしたが、今回は Linux で実行可能なファイルということがわかります。
$ file ./target/quarkus-samples-1.0-SNAPSHOT-runner
./target/quarkus-samples-1.0-SNAPSHOT-runner: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/l, for GNU/Linux 3.2.0, BuildID[sha1]=2dcd414279f78834adb64e491b14f4502bd2ae5a, with debug_info, not stripped
MacOS 上でこのファイルはもちろん実行できません。
Docker コンテナ化
Maven のプロジェクトを作成した際に、ご丁寧に Dockerfile も作成されます。場所は src/main/docker/Dockerfile.native です。
./src
./src/test
./src/test/java
./src/test/java/com
./src/test/java/com/redhat
./src/test/java/com/redhat/quarkus_samples
./src/test/java/com/redhat/quarkus_samples/NativeGreetingResourceIT.java
./src/test/java/com/redhat/quarkus_samples/GreetingResourceTest.java
./src/main
./src/main/docker
./src/main/docker/Dockerfile.native
./src/main/docker/Dockerfile.jvm
./src/main/resources
./src/main/resources/META-INF
./src/main/resources/META-INF/resources./src/main/resources/META-INF/resources/index.html
./src/main/resources/application.properties
./src/main/java
./src/main/java/com
./src/main/java/com/redhat
./src/main/java/com/redhat/quarkus_samples
./src/main/java/com/redhat/quarkus_samples/GreetingResource.java
同じようなファイルで Dockerfile.jvm というものがありますが、こちらは Java のまま起動する場合に使用する Dockerfile になりますので使用しません。Dockefile.native をみてみます。
####
# This Dockerfile is used in order to build a container that runs the Quarkus application in native (no JVM) mode
#
# Before building the docker image run:
#
# mvn package -Pnative -Dnative-image.docker-build=true
#
# Then, build the image with:
#
# docker build -f src/main/docker/Dockerfile.native -t quarkus/quarkus-samples .
#
# Then run the container using:
#
# docker run -i --rm -p 8080:8080 quarkus/quarkus-samples
#
###
FROM registry.access.redhat.com/ubi8/ubi-minimal
WORKDIR /work/
COPY target/*-runner /work/application
RUN chmod 775 /work
EXPOSE 8080
CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]
中身としては簡単です。
redhat が用意する Docker リポジトリhttps://access.redhat.com/containers/#/ から ubi8/ubi-minimal のイメージをダウンロード、target 内に含まれるバイナリ (名称が XXXX-runner) を /work/application にコピーして実行権限を付与して起動しているだけです。ホスト側に 8080 ポートを公開しているのと、すべての IP を使ってリスンするよう設定しています。
ではビルドします。kkosugiredhat の箇所は適宜変更してください。サンプルの通り-t quarkus/quarkus-samples でも問題ありません。
$ docker build -t kkosugiredhat/quarkus-sample:v1 -f ./src/main/docker/Dockerfile.native .
Sending build context to Docker daemon 27.83MB
Step 1/6 : FROM registry.access.redhat.com/ubi8/ubi-minimal
---> 8c980b20fbaa
Step 2/6 : WORKDIR /work/
---> Running in 2a17e347147f
Removing intermediate container 2a17e347147f
---> 5597637e1f4d
Step 3/6 : COPY target/*-runner /work/application
---> bef29c5bc861
Step 4/6 : RUN chmod 775 /work
---> Running in cfb4eb7cb58f
Removing intermediate container cfb4eb7cb58f
---> 6efd57f285cf
Step 5/6 : EXPOSE 8080
---> Running in ab73d89fd0fd
Removing intermediate container ab73d89fd0fd
---> 20e79f5e9aedStep 6/6 : CMD ["./application", "-Dquarkus.http.host=0.0.0.0"]
---> Running in ed7f343314a1
Removing intermediate container ed7f343314a1
---> 25565f878c31
Successfully built 25565f878c31
Successfully tagged kkosugiredhat/quarkus-sample:v1
Docker コンテナの起動
Docker コンテナを起動します。kkosugiredhat の部分は適宜読み替えてください。
$ docker run -d --name quarkus-sample -p 8080:8080 kkosugiredhat/quarkus-sample:v1
f4fa1aac7fe56f74814559681b28eeeda2edf0b48d57b876ef169a56f33adc2a
Docker ログを見てエラーが発生していないか確認します。Java で起動した時と同様のログが出力されています。
$ docker logs quarkus-sample
2019-09-27 01:35:16,906 INFO [io.quarkus] (main) Quarkus 0.22.0 started in 0.005s. Listening on: http://0.0.0.0:8080
2019-09-27 01:35:16,906 INFO [io.quarkus] (main) Installed features: [cdi, resteasy]
ブラウザでアクセス
http://localhost:8080/hello にアクセスして動作を確認します。
動いていることが確認できました。
Docker コンテナの停止
$ docker stop quarkus-sample
quarkus-sample
Docker コンテナの削除
$ docker rm quarkus-sample
quarkus-sample
Docker イメージの削除
$ docker rmi kkosugiredhat/quarkus-sample:v1
Untagged: kkosugiredhat/quarkus-sample:v1
Deleted: sha256:25565f878c319928377f87eb4ef0cea0e7aa3cb95fe16e7cb8ec130cccc8bd89
Deleted: sha256:20e79f5e9aedeb5c470415bb1950199d4b1fa6b5a25e93b87dc0367b9dab68b9
Deleted: sha256:6efd57f285cfc93879fbdeb0626d6eb90d3c867f0897d5768ed703b4b23efa87
Deleted: sha256:27a54226f29391a6b304ccceef7f4331fa444b95d545fbf01becfcdb9b75f299
Deleted: sha256:bef29c5bc8611e70846b7727abae122910a28b4ab006dee44a37b429ba868e58
Deleted: sha256:f92510c1032d34e839bca78829d441008c69f64637899545f1a68585f57a73bd
Deleted: sha256:5597637e1f4de48cc1f13c2b197a203035bc9e586e8c720e206185165a3b4468
Deleted: sha256:d7e9f88f4ed8a340c5eb233eebdb86cd5f055493f704cd0eb30e215eeb8f2cdb