前回、Dockerを使ってSpring Bootアプリケーションをコンテナ化する方法を学びました。これにより、アプリケーションの実行環境が統一され、デプロイが容易になりました。
しかし、実際のアプリケーションは、通常、複数のサービスで構成されます。例えば、Spring Bootアプリケーション本体のコンテナに加え、**データベース(PostgreSQLやMySQL)**のコンテナや、Redisなどのキャッシュコンテナが必要です。
今回は、これらの複数の関連コンテナを一つのファイルで定義し、一括で管理するためのツール **Docker Compose(ドッカー・コンポーズ)**の基本的な使い方を学びます。
1. Docker Composeとは?
Docker Composeは、マルチコンテナアプリケーションを定義・実行するためのツールです。
- 役割: 複数のコンテナの設定(どのイメージを使うか、どのポートを開放するか、環境変数など)と、それらのコンテナ間の依存関係やネットワークを一つの YAMLファイル(通常は docker-compose.yml)に記述します。
- メリット: コマンド一つで、複雑な環境(アプリケーション、DB、キャッシュなど)をまとめて起動・停止できるようになり、開発環境の構築が劇的に簡素化されます。
2. Docker Composeの基本的な構成(docker-compose.yml)
docker-compose.yml ファイルは、主に services というセクションで構成されます。この services 以下に、起動したいコンテナを定義します。
2-1. Spring BootアプリケーションとDBの定義例
以下は、Spring BootアプリケーションとPostgreSQLデータベースの2つのコンテナを定義する docker-compose.yml の例です。
YAML
version: '3.8' # Docker Composeファイルのバージョン
services:
# 1. アプリケーションコンテナの定義(サービス名: app)
app:
# 実行するイメージの指定
# 前回作成したDockerfileを使って、ローカルでイメージをビルドする
build: .
# 依存関係: DBサービスが起動するまで待機
depends_on:
- db
# ホストポート:コンテナポート
ports:
- "8080:8080"
# 環境変数の設定 (DB接続情報)
environment:
SPRING_DATASOURCE_URL: jdbc:postgresql://db:5432/myapp_db
SPRING_DATASOURCE_USERNAME: user
SPRING_DATASOURCE_PASSWORD: password
# 2. データベースコンテナの定義(サービス名: db)
db:
# Docker Hubにある公式のPostgreSQLイメージを使用
image: postgres:14-alpine
# ポートは外部公開しない(appコンテナとの内部通信のみ)
# volumes:
# - ./data/postgres:/var/lib/postgresql/data # データ永続化の設定(今回は省略)
environment:
POSTGRES_DB: myapp_db
POSTGRES_USER: user
POSTGRES_PASSWORD: password
3. Docker Composeの重要な要素
3-1. services
services セクションは、個々のコンテナを定義する場所です。上記の例では、「app」と「db」という2つのサービスを定義しています。
3-2. buildとimage
- build: app サービスのように、ローカルのDockerfile(この例ではカレントディレクトリ . にあるもの)を使ってイメージをビルドする場合に指定します。
- image: db サービスのように、Docker Hubなどから既存のイメージをダウンロードして使用する場合に指定します。
3-3. depends on(依存関係)
depends_on: - db は、「appコンテナを起動する前に、dbコンテナを起動しなさい」という起動順序を指定します。
注意:
depends_onは起動順序を保証するだけで、DBが完全に使える状態(接続可能になる)を保証するものではありません。アプリケーション側でDB接続のリトライ処理などを実装することが望ましいです。
3-4. 内部ネットワーク
Docker Composeが起動するコンテナは、自動で仮想的な内部ネットワークに接続されます。
- サービス名がホスト名になる: 上記の例で、appコンテナが jdbc:postgresql://db:5432/… というURLでDBに接続できるのは、「db」というサービス名が、内部ネットワーク上でのPostgreSQLコンテナのホスト名として解決されるためです。IPアドレスを意識する必要はありません。
4. Docker Composeの実行コマンド
docker-compose.yml ファイルを作成したら、以下のシンプルなコマンドで管理できます。
4-1. 起動とビルド(docker compose up)
Bash
# -d: デタッチモード(バックグラウンド実行)
# --build: Dockerfileに変更があった場合に再ビルドを行う
docker compose up -d --build
このコマンド一つで、DBコンテナが起動し、その後、Spring Bootアプリのコンテナが起動し、両者が内部ネットワークで接続された状態になります。
4-2. 停止と削除(docker compose down)
Bash
# コンテナを停止し、作成されたネットワークを削除
docker compose down
このコマンドで、起動中の全てのコンテナを一括で停止・削除できます。
✅ 本日のまとめ
- Docker Composeは、複数のコンテナ(アプリケーション、DB、キャッシュなど)を一つの YAMLファイルで定義し、一括で管理するためのツールである。
- docker-compose.yml の services セクションに、各コンテナの設定を記述する。
- build はローカルの Dockerfile を使ってビルドする場合に、image は既存のイメージを使う場合に指定する。
- depends on でコンテナの起動順序を指定する。
- コンテナ間は内部ネットワークで接続され、サービス名(例: db)がホスト名として利用できるため、IPアドレスを意識する必要がない。
docker compose up -dで一括起動、docker compose downで一括停止を行う。
🔔 次回予告
これで、ローカルの開発環境でアプリケーションとDBを簡単に構築・実行できるようになりました。しかし、本番環境でこのコンテナを動かし続けるためには、コンテナの状態を監視し、ログを集約する仕組みが必要です。
次回は、サーバーの運用監視と、Spring Bootのヘルスチェック機能である Spring Boot Actuator について学びます。
次回:【第43回】アプリケーションの健全性チェック!〜Spring Boot Actuatorの活用〜 にご期待ください!


コメント