👋

Spring bootプロジェクトのDocker化

2023/02/17に公開

前提

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 --chown=gradle:gradle ./ /home/gradle/src/
WORKDIR /home/gradle/src
RUN gradle build --no-daemon 

FROM openjdk:17
EXPOSE 8080
WORKDIR /app
COPY --from=build /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