Spring bootプロジェクトのDocker化
前提
Spring bootプロジェクトの新規作成にて行ったプロジェクトファイルを使って今回Docker化を行います。
もしSpring bootのプロジェクトを作成してない人は、前の章に戻り作成を行なってください。
Spring bootプロジェクトのDockerコンテナ作成
Spring bootプロジェクトのDockerコンテナを作成する方法として、さまざまな方法がありますが今回は以下の2つについて取り上げていきます。
- jibを使ってDockerコンテナ化を行う方法
- dockerマルチステージビルドを行いコンテナ化をする方法
jibを使ってDockerコンテナ化をする
jibとは何か
Jibは、Dockerイメージを作成するためのオープンソースのJavaライブラリです。
Dockerfileを作成して使用する代わりに、Jibはビルドツールに統合されていて、Javaで作られたアプリケーションをDockerコンテナにパッケージ化するための便利なツールになります。
Jibは、Java開発者がDockerイメージを構築するために必要な作業を簡素化し、Dockerデーモンを必要とせず、ビルドプロセスの一部として実行することができ、ビルドプロセスを高速化し、セキュリティ上のリスクを軽減することができます。
また、JibはDockerレジストリに直接イメージをプッシュすることもで、Dockerイメージのビルドとデプロイが単一のツールとして統合され、開発プロセスがシームレス化することが可能です。
現在のファイル構成
現在以下のようなファイル階層になっていると思います。
jibを使うにはbuild.gradle
にこれから設定を追記していきます。
# tree -L 1
.
├── build.gradle <- 今回編集するファイル
├── gradle
├── gradlew
├── gradlew.bat
├── settings.gradle
└── src
jibを利用するための設定
build.gradleを開き以下の内容を記述します。
plugins {
....(途中省略)....
id 'com.google.cloud.tools.jib' version '3.2.1'
}
....(途中省略)....
jib {
to {
image = 'spring-boot-application'
}
from {
image = 'openjdk:17-alpine'
}
container{
ports = ['8080']
format = 'OCI'
}
}
jibの実行
Spring bootプロジェクトファイルを開き、以下のgradleのコマンドを入力します。
コマンドが実行されるとjibのタスクが実行されると思います。
./gradlew jibDockerBuild
Executing tasks:
[==============================] 100.0% complete
BUILD SUCCESSFUL in 29s
3 actionable tasks: 3 executed
BUILD SUCCESSFUL
が表示されれば終了です。
実行した後のdockerイメージは以下のような感じになります。
このイメージを実行するには以下のdockerコマンドを実行することで利用することができます。
docker run -it --rm -p 8080:8080 spring-boot-application
dockerマルチステージビルドを行いコンテナ化をする
現在のファイル構成
以下のようなファイル階層に docker>app>Dockerfile
構成でフォルダーを作り、さらにdocker-composeコマンドが使えるようにdocker-composeファイルを用意します。
※ ファイル構成などに関しては適宜環境に応じて変更してください。
# tree -L 1
.
├── build.gradle
├── gradle
├── gradlew
├── docker
│ └── app
│ └── Dockerfile
├── gradlew.bat
├── docker-compose.yml
├── settings.gradle
└── src
Dockerfileとdocker-compose.ymlの記述内容
Dockerfileの記述になります。
FROM gradle:7.4.2-jdk17 AS build
COPY ./ /home/gradle/src/
WORKDIR /home/gradle/src
RUN gradle build --no-daemon
FROM openjdk:17
EXPOSE 8080
WORKDIR /app
COPY /home/gradle/src/build/libs/*.jar ./spring-boot-application.jar
ENTRYPOINT ["java", "-jar", "spring-boot-application.jar"]
docker-compose.ymlの記述になります。
version: '3'
services:
app-springboot:
ports:
- 8080:8080
tty: true
build:
context: .
dockerfile: ./docker/app/Dockerfile
dockerコンテナの実行
以上の作業を経て、dockerが実行できるようになるので以下のコマンドを実行して起動します。
# docker-compose up -d
コンテナが実行されると以下のようにDocker Desktopから確認することかできます。
imageの様子
コマンドで作成したイメージを確認するには以下のコマンドから確認できます。
# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
sample-app-springboot latest 454f1dbbb1a7 7 minutes ago 521MB
コンテナ起動の様子
コマンドで起動中のコンテナを確認するには以下のコマンドから確認できます。
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6ad072af2a04 sample-app-springboot "java -jar spring-bo…" 4 minutes ago Up 4 minutes 0.0.0.0:8080->8080/tcp sample-app-springboot-1
Discussion