Spring Bootをコンテナで動かしたい

n-ozawan

皆さん、こんにちは。技術開発グループのn-ozawanです。
毎年10月の第4週には、長野県と静岡県で県境をかけた綱引き合戦が行われます。

本題です。
以前、Next + Expressをイメージ化する方法を取り上げました。せっかくなのでSpring Bootで作成したアプリケーションをイメージ化する方法を紹介します。とはいえ、特に語ることがないほど、すごい簡単です。

Spring Boot プロジェクトのコンテナ化

プロジェクトの準備

Spring Bootプロジェクトを用意します。環境はGradleです。Spring Bootのプロジェクトは、公式がGitHubで公開していますので、それをダウンロードします。

ダウンロードしたらgradlewに実行権限を付与します。

chmod +x gradlew

SpringBootを実行します。

./gradlew bootRun

curlでリクエストを送信して返答があれば成功です。

curl http://localhost:8080

Greetings from Spring Boot!

方法①:bootBuildImageでイメージを作成する

イメージを作成する方法は大きく2通りあります。その内の1つはbootBuildImageタスクを実行する方法です。以下のコマンドを実行します。

./gradlew bootBuildImage --imageName=spring-boot-app

上記のコマンドで、プロジェクトのビルドからイメージの作成までを行ってくれます。Dockerfileは不要です。

方法②:Dockerfileでイメージを作成する

もう1つの方法はDockerfileからイメージを作成する方法です。内容は非常にシンプルで、必要最小限であれば4行で済みます。

FROM openjdk:21-jdk
ARG JAR_FILE=target/*.jar
COPY ${JAR_FILE} app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

引数にJAR_FILEを受け取るようにしています。もし、JAR_FILEを受け取らなかった場合は、デフォルト値としてtarget/*.jarを参照します。処理内容としては、jarファイルをイメージにコピーして、そのjarファイルを実行しているだけです。

プロジェクトのルートにDockerfileを格納したら、以下のコマンドによりイメージを作成します。

./gradlew build && docker build --build-arg JAR_FILE=build/libs/spring-boot-0.0.1-SNAPSHOT.jar -t spring-boot-app .

引数にJAR_FILEを指定することにより、イメージにコピーするjarファイルを指定します。

動作確認をする

方法①と②とともに、以下のコマンドでコンテナを起動します。

docker run -p 8080:8080 -it spring-boot-app

正常にコンテナが動いているか確認してみましょう。

curl http://localhost:8080

Greetings from Spring Boot!

おわりに

方法①の「bootBuildImageでイメージを作成する」方法では、Cloud Native Buildpacks (CNB)と呼ばれるツールが使われています。CNBは、Dockerfileを書かずに、クラウドでの動作に最適化されたコンテナのイメージを作成するツールです。Dockerfileを知らなくても最適化されたイメージが作成できるなんて、すごい便利な時代になりましたね。

ではまた。

Recommendおすすめブログ