
実務では、Webアプリとデータベースは完全に別のコンテナとして分離して動かすのが鉄則です。これで、アプリを再起動してもデータが消えないようにすることが可能になります。そのためには、Docker Compose という技術を使い、「Javaアプリのコンテナ」と「独立したPostgreSQLのコンテナ」の2つを同時に立ち上げます。今回はこの Docker Compose で、Java (Spring Boot) のWebアプリとPostgreSQLを連携させていきます。
ここから先は、以下の記事まで対応済みであることを前提としています。ご了承ください。
Docker Compose (複数コンテナ連携)
これまでの H2 Database に代わり、本物のデータベースである PostgreSQL に接続するためのライブラリをプロジェクトに導入します。これでデータの永続化が可能になります。具体的な流れは以下の通りです。
- Docker の起動
- pom.xml に PostgreSQL のドライバー追加
- 環境変数に対応できるように設定ファイル編集
- アプリの再ビルド
- 全体設計図 (docker-compose.yml) の作成
- Docker Compose で一括起動
- 動作確認
Docker の起動
最初に Docker Desktop のアイコンをダブルクリックするなど、Docker を起動しておきましょう。
pom.xml に PostgreSQL のドライバー追加
<dependency>
<groupId>org.postgresql</groupId>
<artifactId>postgresql</artifactId>
<scope>runtime</scope>
</dependency>pom.xml の <dependencies> の中に以下を追記し、Mavenの更新してください。この記述は、これまでの H2 Database に代わり、本物のデータベースである PostgreSQL に接続するためのライブラリをプロジェクトに導入するという意味になります。
環境変数に対応できるように設定ファイル編集
# 接続先URL(環境変数 DB_HOST がなければ localhost の todo_db に接続)
spring.datasource.url=jdbc:postgresql://${DB_HOST:localhost}:5432/todo_db
spring.datasource.username=postgres
spring.datasource.password=password
spring.datasource.driver-className=org.postgresql.Driver
# JPA/Hibernateの設定(PostgreSQL用に最適化し、テーブルを自動生成する)
spring.jpa.database-platform=org.hibernate.dialect.PostgreSQLDialect
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=trueapplication.properties を上記のように書き換えてください。
これまでは application.properties に H2 の接続先を直接書いていました。Dockerコンテナとして外に出す場合、IPアドレスやパスワードなどの接続先は外部から柔軟に変えられるよう環境変数を使って記述するのが実務の標準です。
アプリの再ビルド

PostgreSQLのライブラリを含めた状態で、再度Jarファイルを作成します。まず、プロジェクトを右クリックし、実行から Maven ビルド を選択してください。

Goals 欄に clean package -DskipTestsと入力し、実行をクリックしてください。-DskipTests はJarファイル作成時にテスト工程をスキップするものです。

コンソールに BUILD SUCCESS の文字が出たら、target フォルダに demo-0.0.1-SNAPSHOT.jar ができていることを確認してください。
全体設計図 (docker-compose.yml) の作成

プロジェクトのルートディレクトリを右クリックし、[新規] -> [ファイル] で docker-compose.yml というファイルを作成します。(Dockerfile や pom.xml と同じ階層)
version: '3.8'
services:
# 1. データベース用のコンテナ(PostgreSQL 16を使用)
db:
image: postgres:16-alpine
container_name: todo-db-container
environment:
POSTGRES_DB: todo_db
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
ports:
- "5432:5432"
volumes:
- db-data:/var/lib/postgresql/data # 【永続化】コンテナを消してもデータが残る魔法の設定
# 2. Javaアプリケーション用のコンテナ
web:
build: .
container_name: todo-web-container
ports:
- "8080:8080"
environment:
DB_HOST: db # 設定ファイルで定義したデータベースのサービス名(db)を指定
depends_on:
- db # dbコンテナが先に起動してから、webコンテナを起動する
# データの保管場所(ボリューム)の定義
volumes:
db-data:docker-compose.yml に上記の内容を記述して保存してください。
Docker Compose で一括起動

ターミナルを管理者権限で開き、docker-compose.yml が置いてあるプロジェクトのルートディレクトリに移動します。上記画像は管理者権限で開いた Windows のコマンドプロンプトです。

docker compose up --build -dターミナルで上記コマンドを実行してください。コマンドを実行すると、自動的にPostgreSQLのイメージがダウンロードされ、2つのコンテナが同時に立ち上がります。
動作確認

http://localhost:8080/todo にアクセスしてください。(※ Eclipse 側のアプリが起動していないこと) アクセスした後、新しいタスクを追加してください。

docker compose downここからが永続化の実験です。ターミナルで上記のコマンドを打ち、一度コンテナを完全に「破棄」します。(※これで、上記画像のようにアプリとDBのコンテナはPC上から完全にRemoveされました)

docker compose up -d再度、上記コマンドでコンテナを起動してください。

ブラウザで再度 http://localhost:8080/todo にアクセスし、先ほど追加した内容がそのまま残っていることを確認してください。
データが残っているということが、docker-compose.yml の最下部で定義した volumes によって、データがPC内の安全な領域に永続化されている証拠になります。
コメント