Docker Composeで、Webアプリ開発環境を作る

今回は、典型的な「フロントエンド(React等) + バックエンド(Spring/Node等) + データベース(MariaDB)」の構成を例に docker-compose.yml を書いた。

今回の構成

3つのコンテナ(Service)が専用のネットワーク内で連携し、データはボリュームによって永続化される構成。

完成した docker-compose.yml

以下が今回解説する設定ファイル。例として小説検索システム(Novel Search System)のようなアプリケーションを想定している。

services:
  backend:
    build: ./backend
    container_name: novel-backend
    ports:
      - "8080:8080"
    environment:
      - DB_URL=jdbc:mariadb://novel-db:3306/${DB_NAME}
      # ... (省略)
    depends_on:
      novel-db:
        condition: service_healthy # ここが重要!
    networks:
      - novel-network

  frontend:
    build: ./frontend
    container_name: novel-frontend
    ports:
      - "80:80"
    depends_on:
      - backend
    networks:
      - novel-network

  novel-db:
    image: mariadb:12.1
    container_name: novel-db
    environment:
      - MARIADB_DATABASE=${DB_NAME}
      # ... (省略)
    healthcheck:
      test: ["CMD-SHELL", "mariadb-admin ping -h localhost -u root -p$$MARIADB_ROOT_PASSWORD || exit 1"]
      interval: 10s
      timeout: 5s
      retries: 10
    volumes:
      - db_data:/var/lib/mysql
      - ./backend/sql:/docker-entrypoint-initdb.d
    networks:
      - novel-network

networks:
  novel-network:
    driver: bridge

volumes:
  db_data:

1.データベースの「起動待ち」を完璧にする healthcheck

Docker Composeでよくあるトラブルが、「DBが完全に立ち上がる前にバックエンドが接続に行き、エラーで落ちる」という現象。

単なる depends_on: – novel-db だけでは、「コンテナが作成された」ことしか確認できず、「DB接続の準備ができた」ことまでは保証されない。

そこでHealthcheck(ヘルスチェック) を行う。

novel-db:
    # ...
    healthcheck:
      test: ["CMD-SHELL", "mariadb-admin ping ..."]
      interval: 10s
      retries: 10

ここでは mariadb-admin ping コマンドを定期的に実行し、DBが応答するかを監視している。

backend側では以下のように記述する。

backend:
    depends_on:
      novel-db:
        condition: service_healthy

これにより、「DBのヘルスチェックがOKになるまで、バックエンドを起動させない」という制御が可能になる。

2.データの永続化と初期データの投入

データベースをコンテナ化する際、コンテナを削除するとデータも消えてしまう。これを防ぐのが volumes 。

volumes:
      - db_data:/var/lib/mysql
      - ./backend/sql:/docker-entrypoint-initdb.d

  • db_data:/var/lib/mysql: ホスト側(Docker管理領域)にデータを保存する。コンテナを作り直しても、小説データやユーザーデータは消えない。
  • ./backend/sql:/docker-entrypoint-initdb.d: MariaDBやMySQLの公式イメージは、/docker-entrypoint-initdb.d に置かれた .sql ファイルを、初回起動時に自動実行してくれる。 テーブル作成や初期データの投入を自動化できるため、開発メンバー全員が docker compose up 一発で同じDB状態から開発をスタートできる。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です