search
LoginSignup
0

More than 1 year has passed since last update.

posted at

updated at

Organization

JavaのWebアプリケーションをDockerのマルチステージビルドでデプロイする

本記事は東京学芸大学 櫨山研究室 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/

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
What you can do with signing up
0