本記事は東京学芸大学 櫨山研究室 Advent Calendar 2020の四日目の記事になります.
概要
- Javaで作成したWebアプリケーションをDockerを使ってデプロイする
本記事のコードは以下のGitHubリポジトリで公開しています.
動作させるアプリケーション
Building Java Web Applications, https://guides.gradle.org/building-java-web-applications/
Building Java Web Applications, https://medium.com/@tutorialspointexamples/building-java-web-applications-760d656061e4
にあるサンプルアプリケーションをDockerで動作させてみます.
※Gradleの公式ドキュメントがリンク切れだったので同じコードを紹介している別のリンクを載せています.
マルチステージビルド
コンテナを用いた開発では本番環境向けにサイズの小さいDockerイメージを作成することは重要になります.
よってビルド後の生成物だけを含んだイメージを作成するのが理想となります.
Dockerのマルチステージビルドはこのような要求を簡単に実現する方法になります.
今回のJavaのWebアプリケーションをマルチステージビルドの流れを図に起こすと以下のようになります.
はじめにビルドステージと命名したステージでソースコードをビルドしwarファイル
を生成します.
その次の本番用ステージと命名したステージでwarファイル
をjettyに配備します.
Dockerfile
この流れを記述したDockerfile
は以下のようになります.
# ビルドステージ
FROM adoptopenjdk/openjdk8:alpine as builder
WORKDIR /webapp
# プロジェクトの配置とビルド
ADD ./ ./
RUN ./gradlew war
# 本番用ステージ
FROM jetty:9-jdk8
EXPOSE 8080
COPY --from=builder ./webapp/build/libs/sample-app.war /var/lib/jetty/webapps
公式のjettyイメージでは/var/lib/jetty/webapps/
配下にwar
ファイルを配備することでデプロイが完了します.
Dockerイメージのビルドとコンテナの起動
dockerイメージのビルドし,コンテナを起動しアプリケーションが正常に動作しているかを確認します.
docker image build -t sample-app:latest .
docker container run -p 8080:8080 sample-app:latest
正常に起動したら,http://localhost:8080/sample-app/ にアクセスをします.
以下の画面になっていたら成功です.
テキストフィールドにworld
と入力しSay Hello
ボタンをクリックしましょう.
きちんとHello, world!
と出力されました.
これで正常に動作していることが確認できました.
Docker Imageのサイズを確認
サンプルアプリケーションでそもそものアプリケーションのサイズがとても小さいので比較にもなりませんがDockerのイメージサイズを確認しておきます.
# ベースのjettyのイメージサイズ
$ docker image ls jetty
REPOSITORY TAG IMAGE ID CREATED SIZE
jetty 9-jdk8 12fc9041849d 10 days ago 525MB
# アプリケーションを配備したイメージサイズ
$ docker image ls sample-app
REPOSITORY TAG IMAGE ID CREATED SIZE
sample-app latest 4096cac4f49a 10 minutes ago 525MB
本格的な開発ではDockerイメージの大きさがどの程度かを確認する癖をつけると良いでしょう🙇♂️
参考文献
マルチステージビルドの利用,https://matsuand.github.io/docs.docker.jp.onthefly/develop/develop-images/multistage-build/