こんにちは!
以前、Java + Docker + MariaDB を使った環境構築を行いました。
当時は Java 標準の HttpServer を使い、最低限「動く」Webアプリを構築しましたが、
実際に触ってみると Webアプリとしての拡張性・保守性に大きな制約 があることに気づきました。
▼ 前回の記事
具体的には、
- ルーティングや設定をすべて自前実装する必要がある
- DI・例外処理・設定管理が弱い
- 機能追加のたびに修正箇所が増えやすい
といった点がネックでした。
本記事では、その構成を Spring Boot を用いた実用的な Web アプリ構成 に置き換え、Docker 上で動作する Java Web 環境 を構築します。
使用技術
- Java 17
- Spring Boot 3.2
- Docker / Docker Compose
- MariaDB
- Maven
- Spring Data JPA
- Thymeleaf(画面用)
Dockerfile
FROM eclipse-temurin:17-jdk-alpine
WORKDIR /app
RUN apk add --no-cache maven
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn clean package -DskipTests
EXPOSE 8080
CMD ["java", "-jar", "target/product-management-0.0.1-SNAPSHOT.jar"]
ポイント解説
-
OpenJDK 17(Alpine)
- 軽量で起動が早いらしい
-
Maven をコンテナ内で使用
- ローカル環境に Maven をインストールせずにビルド可能
-
dependency:go-offline
- 依存関係を先にダウンロードし、Dockerビルドを高速化
-
Spring Boot の fat jar を実行
-
java -jarでシンプルに起動できる
-
docker-compose.yml
version: '3.8'
services:
mariadb:
image: mariadb:10.8
container_name: java_lp_mariadb
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: productdb
MYSQL_USER: appuser
MYSQL_PASSWORD: apppassword
ports:
- "3308:3306"
volumes:
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
- mariadb_data:/var/lib/mysql
networks:
- app-network
app:
build: .
container_name: java_lp_app
ports:
- "8081:8080"
environment:
SPRING_DATASOURCE_URL: jdbc:mariadb://mariadb:3306/productdb
SPRING_DATASOURCE_USERNAME: appuser
SPRING_DATASOURCE_PASSWORD: apppassword
SPRING_JPA_HIBERNATE_DDL_AUTO: update
depends_on:
- mariadb
networks:
- app-network
volumes:
mariadb_data:
networks:
app-network:
driver: bridge
MariaDB コンテナ
- DB名・ユーザー・パスワードを環境変数で定義
-
init.sqlを使って初期データやテーブル作成が可能
(IF NOT EXISTSを使ったCREATE TABLEを想定)
Spring Boot アプリコンテナ
- DB接続情報を 環境変数で注入
-
depends_onにより DB コンテナ起動後にアプリを起動 -
8081 → 8080でローカルからアクセス可能
pom.xml
<dependencies>
<!-- Webアプリ用 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- JPA / ORM -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<!-- テンプレートエンジン -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<!-- MariaDB ドライバ -->
<dependency>
<groupId>org.mariadb.jdbc</groupId>
<artifactId>mariadb-java-client</artifactId>
<scope>runtime</scope>
</dependency>
<!-- バリデーション -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
</dependencies>
ポイント
- Spring Boot Starter を中心に構成
- JDBC ドライバは
runtimeスコープ - CRUD・画面作成・入力チェックをそのまま拡張可能
起動クラス
package com.example.productmanagement;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ProductManagementApplication {
public static void main(String[] args) {
SpringApplication.run(ProductManagementApplication.class, args);
}
}
このクラスが Spring Boot アプリのエントリーポイント となり、
java -jar 実行時にアプリ全体が起動します。
いったんこちらの環境構築を基にいろいろと作成していきます。