Spring boot+dockerで webアプリケーション環境構築
はじめに
dockerとspring bootを用いたwebアプリケーションの環境構築について、説明します。
階層図
project-root
├── gradle
│ └── wrapper
│ ├── gradle-wrapper.jar
│ └── gradle-wrapper.properties
├── src
│ ├── main
│ │ ├── java
│ │ │ └── com
│ │ │ └── example
│ │ │ └── demo
│ │ │ ├── controller
│ │ │ │ ├── HelloController.java
│ │ │ │ └── UserController.java
│ │ │ └── service
│ │ │ └── UserService.java
│ └── resources
│ └── test
│ └── java
│ └── com
│ └── example
│ └── demo
│ └── JavaAppApplicationTests.java
├── .gitignore
├── Dockerfile
├── build.gradle
├── docker-compose.yml
├── gradlew
└── gradlew.bat
build.gradleの設定
Gradleとは
Java向けに開発されたオープンソースのビルドツールです。
build.gradleはプロジェクトのビルドに関する設定を記述するファイルであり、Gradleがこれを読み込んでビルド作業を進める役割を果たしています。
plugins {
id 'org.springframework.boot' version '2.7.3'
id 'io.spring.dependency-management' version '1.0.13.RELEASE'
id 'java'
}
group = 'com.example'
version = '0.0.1-SNAPSHOT'
sourceCompatibility = '17'
repositories {
mavenCentral()
}
dependencies {
implementation 'org.springframework.boot:spring-boot-starter-web'
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
developmentOnly 'org.springframework.boot:spring-boot-devtools'
runtimeOnly 'org.postgresql:postgresql'
testImplementation 'org.springframework.boot:spring-boot-starter-test'
}
tasks.named('test') {
useJUnitPlatform()
}
plugins
・id 'org.springframework.boot' version '2.7.3'
このプラグインはSpring Boot用のGradleプラグインで、Spring Bootアプリケーションの構築や実行に必要なツールとタスクを提供します。
bootRun タスクを提供し、開発中のアプリケーションを起動します。
・id 'io.spring.dependency-management'
依存関係の管理をSpring Bootと連携して行うためのプラグインです。バージョンや依存関係の解決を効率化します。
・id 'java'
id 'java'を指定することで次のようなタスクが利用可能になりま
・compileJava: Javaソースコードのコンパイル
・test: 単体テストの実行
・jar: JARファイルのパッケージ化
sourceCompatibility
sourceCompatibility = '17' は、プロジェクトが使用する Java のバージョンを指定します。この場合、Java 17 を使用することを意味します。これにより、指定したバージョンに対応した言語機能を使用できるようになります。
dependencies
Projectが利用するライブラリです。
設定されている各項目について、解説します。
implementation 'org.springframework.boot:spring-boot-starter-web'
Spring Boot
アプリケーションでウェブアプリケーションを構築するための便利なスターター依存関係です。このスターターを使うことで、以下のような重要なコンポーネントが自動的にセットアップされます。
・Spring MVC
ウェブアプリケーションのためのフレームワークで、HTTPリクエストの処理やコントローラーの実装をサポートします。
・Tomcat
デフォルトの組み込みサーバーとして、アプリケーションを簡単に実行できるようにします。他のサーバー(Jetty や Undertow)も選択可能です。
・Jackson
JSONのシリアライズおよびデシリアライズを行うライブラリで、RESTful APIを構築する際に便利です。
Spring Bootの設定: 一般的な設定や初期設定が自動的に行われ、開発がスムーズになります。
implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
・Spring Data JPA
JPA(Java Persistence API)を使用してデータベース操作を行うためのフレームワークです。リポジトリパターンを使ったデータアクセスが簡単に実装できます。
・Hibernate
JPAの実装として、エンティティのマッピングやクエリの実行を行います。デフォルトで組み込まれているため、特別な設定をしなくても使用できます。
・データベース接続
データソースの設定が自動的に行われ、アプリケーションプロパティを通じて簡単にデータベースに接続できます。
・トランザクション管理
JPAのトランザクション管理が組み込まれており、データベース操作に関するトランザクションを簡単に扱えます。
runtimeOnly 'org.postgresql:postgresql'
実行時に使用できるように、ビルド出力だけに依存関係を追加する。
testImplementation 'org.springframework.boot:spring-boot-starter-test'
テスト実行時のみ、依存関係をコンパイルクラスパスに追加する。
test {
useJUnitPlatform()
}
testブロックはGradleの標準的なタスクで、JUnitを使ったテストを実行するために設定されます。
useJUnitPlatform()は、JUnit 5をテストプラットフォームとして使用することを指定します。この構文により、JUnit 5の特徴的なアノテーションや機能が利用可能になります。
gradle-wrapper.propertiesについて
「Wrapper(ラッパー)」とは、Gradleがインストールされていない環境でもGradleビルドを実行できるようにするための仕組みです。
これは、プロジェクトで必要なGradleの特定のバージョンをダウンロードして使うためのスクリプトであり、すべての開発者が同じGradleのバージョンを使用できるようにします。
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://services.gradle.org/distributions/gradle-7.4.2-bin.zip
networkTimeout=10000
validateDistributionUrl=true
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
distributionUrl に、使用したいGradleのバージョンを指定する。
Gradle公式ドキュメント
HelloController.javaに「Hello World」を記述
package com.example.demo.controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@GetMapping("/")
public String hello() {
return "Hello World!";
}
}
@RestController
Thymeleafによって生成されるHTMLをレスポンスする場合は、@Controllerを使います。
JSONやXMLをレスポンスするようなAPI形式の場合は、@RestControllerを使うのが適切です。
@GetMapping("/") の "/" は、ルートURL(例: http://localhost:8080/
)を意味します。そのため、ブラウザなどでこのルートURLにアクセスすると、このメソッド hello() が呼び出されます。
@GetMapping("/")
HTTP GETリクエストを指定したURLパス(ここでは"/")にマッピングします。このアノテーションをメソッドに付けることで、そのメソッドが指定されたパスに対するGETリクエストに応答するようになります。
docker-composer.ymlの設定
version: "3.6"
services:
web:
build:
context: .
dockerfile: Dockerfile
container_name: demo-java
tty: true
working_dir: /app
volumes:
- .:/workspace
- ./src:/app/src
- ./build.gradle:/app/build.gradle
- ./settings.gradle:/app/settings.gradle
- ./gradle:/app/gradle
- ./gradlew:/app/gradlew
- ./gradlew.bat:/app/gradlew.bat
- ./gradle.properties:/app/gradle.properties
ports:
- 8080:8080
- 5050:5050
- 35729:35729
environment:
- SPRING_DATASOURCE_URL=jdbc:postgresql://db:5432/mydatabase
- SPRING_DATASOURCE_USERNAME=postgres
- SPRING_DATASOURCE_PASSWORD=postgres
- JAVA_OPTS=-Dspring.devtools.restart.enabled=true -Dspring.devtools.livereload.enabled=true
db:
image: postgres:13
container_name: demo-postgres
environment:
- POSTGRES_DB=mydatabase
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
ports:
- "5432:5432"
volumes:
- postgres-data:/var/lib/postgresql/data
volumes:
postgres-data:
Dockerfileの設定
# ベースイメージとしてGradleを使用
FROM gradle:7.4.2-jdk17 AS build
# 作業ディレクトリの設定
WORKDIR /app
# プロジェクトファイルのコピー
COPY . .
# プロジェクトのビルド
RUN gradle bootJar --no-daemon
# JARファイルの存在を確認
RUN ls -l /app/build/libs
# ランタイムイメージとしてOpenJDKを使用
FROM openjdk:17-jdk-slim
# 必要なツールのインストール
RUN apt-get update && apt-get install -y findutils && apt-get clean
# ポート8080を公開
EXPOSE 8080
# 作業ディレクトリの設定
WORKDIR /app
# ビルド済みのJARファイルをコピー
COPY --from=build /app/build/libs/*.jar /app/app.jar
# コピーの確認
RUN ls -l /app
# アプリケーションの実行
ENTRYPOINT ["java", "-jar", "/app/app.jar"]
dockerコマンドでコンテナを立ち上げる
プロジェクトのルートディレクトリーに移動して、以下のコマンドを実行します。
# Dockerイメージをビルドする
docker-compose build
# コンテナを起動する
docker-compose up
http://localhost:8080/
にアクセス
ブラウザに表示されました。
参考リポジトリ
- GitHubリポジトリ: Java-app
まとめ
DockerとSpring Bootを使用したWebアプリケーションの環境構築手順について説明しました。主なポイントとして、Gradleを使用したビルドの設定、Spring Bootアプリケーションの依存関係管理、Dockerfileやdocker-compose.ymlの設定を通して、簡単に開発環境を構築する方法を紹介しました。
Discussion