ゴール 前提 1. SpringBootのプロジェクトを初期化する 2. Dockerfileを作成する 3. Dockerイメージをビルドする 4. Dockerコンテナを作成し、起動する 5. 動作確認
ゴール
Docker上でSpringBootが動くようにする。
参考:Docker で Spring Boot - 公式サンプルコード
前提
ビルドツールはGradleを用いて行う。
Gradle専用のパスやコマンドがあるので、Mavenの場合は公式ドキュメントを参考に読み替えてほしい。
- Java:23.0.2
- SpringBoot:3.4.2
1. SpringBootのプロジェクトを初期化する
📄SpringBootでWebFluxを用いたAPIの環境構築をする(Gradle)
ここで詳しく解説しているので、プロジェクト初期化から始める場合はこちらを参照してほしい。
2. Dockerfileを作成する
参考の公式ドキュメントでは
- 手元でjarファイルを作成
- 手元のjarを使って、Dockerイメージを作成する
という流れだったが、今回はマルチステージビルドの機能を利用して
- ビルド用のDocker上でjarファイル作成
- 実行用の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 /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
にアクセスすると、実行できていることがわかる。
