エンジニアを目指す初学者に向けて、わかりやすく解説したブログです。
サイトをリニューアルしました

SpringBootのプロジェクトをDockerで動かす

ゴール

Docker上でSpringBootが動くようにする。

参考:Icon in a page linkDocker で Spring Boot - 公式サンプルコード

前提

ビルドツールはGradleを用いて行う。
Gradle専用のパスやコマンドがあるので、Mavenの場合は公式ドキュメントを参考に読み替えてほしい。

  • Java:23.0.2
  • SpringBoot:3.4.2

1. SpringBootのプロジェクトを初期化する

📄Arrow icon of a page linkSpringBootでWebFluxを用いたAPIの環境構築をする(Gradle)

ここで詳しく解説しているので、プロジェクト初期化から始める場合はこちらを参照してほしい。

2. Dockerfileを作成する

参考の公式ドキュメントでは

  1. 手元でjarファイルを作成
  2. 手元のjarを使って、Dockerイメージを作成する

という流れだったが、今回はマルチステージビルドの機能を利用して

  1. ビルド用のDocker上でjarファイル作成
  2. 実行用のDockerで実行

のような構成とする。

# こちらはjarの生成用
FROM eclipse-temurin:23-alpine AS builder

# 作業ディレクトリを指定
WORKDIR /workspace

# ソースコードをコピー
COPY . .

# 実行可能なjarファイルを生成
RUN ./gradlew bootJar


# こちらは実行用
FROM eclipse-temurin:23-alpine

# セキュリティリスク対策として、rootユーザーではなくspringユーザーを使うようにする
RUN addgroup -S spring && adduser -S spring -G spring
USER spring:spring

# builderで作った成果物を「app.jar」という名前でコピーする
COPY --from=builder /workspace/build/libs/*.jar app.jar

# 起動コマンド
ENTRYPOINT ["java","-jar","/app.jar"]

3. Dockerイメージをビルドする

イメージ名「springboot-api」でタグが「1.0」のDockerイメージをビルド。

docker build -t springboot-api:1.0 .

イメージが作られたことが確認できる。

$ docker image ls
REPOSITORY                                          TAG         IMAGE ID       CREATED         SIZE
springboot-api                                      1.0         e0b4a6625970   8 seconds ago   395MB

4. Dockerコンテナを作成し、起動する

$ docker container run -it --name springboot-api-container -p 8080:8080 springboot-api:1.0

  .   ____          _            __ _ _
 /\\ / ___'_ __ _ _(_)_ __  __ _ \ \ \ \
( ( )\___ | '_ | '_| | '_ \/ _` | \ \ \ \
 \\/  ___)| |_)| | | | | || (_| |  ) ) ) )
  '  |____| .__|_| |_|_| |_\__, | / / / /
 =========|_|==============|___/=/_/_/_/

 :: Spring Boot ::                (v3.4.2)

2025-02-11T10:25:54.405Z  INFO 1 --- [api] [           main] com.example.api.ApiApplication     : Starting ApiApplication v0.0.1-SNAPSHOT using Java 23.0.2 with PID 1 (/app.jar started by spring in /)
2025-02-11T10:25:54.406Z  INFO 1 --- [api] [           main] com.example.api.ApiApplication     : No active profile set, falling back to 1 default profile: "default"
2025-02-11T10:25:55.181Z  INFO 1 --- [api] [           main] o.s.b.web.embedded.netty.NettyWebServer  : Netty started on port 8080 (http)
2025-02-11T10:25:55.198Z  INFO 1 --- [api] [           main] com.example.api.ApiApplication     : Started ApiApplication in 1.024 seconds (process running for 1.325)

5. 動作確認

localhost:8080にアクセスすると、実行できていることがわかる。

Image in a image block