🏗️ Spring Framework 講座【第42回】複数コンテナの統合管理!〜Docker Composeの活用〜

docs

前回、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の活用〜 にご期待ください!

コメント

タイトルとURLをコピーしました