今回は、典型的な「フロントエンド(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状態から開発をスタートできる。