第08回: ヘルスチェックと起動順制御 — 「DBが起動していない」エラーを根絶する

章: 第2章: Docker Compose実践

docker compose up したら「DB接続失敗」でアプリがクラッシュした経験はありませんか?

これはよくあるトラブルです。depends_on: db を設定していても、DBのプロセスが起動しただけで「接続を受け付けられる状態」にはなっていない、という状況で起きます。

ヘルスチェックと condition: service_healthy を使うことで、DBが本当に接続を受け付けられる状態になってからアプリを起動できるようになります。

depends_onだけでは足りない理由

depends_on はコンテナの「起動順序」を制御しますが、「サービスが準備完了かどうか」は判定しません。MySQLはプロセスが起動してから実際に接続できるまでに数秒かかります。

ヘルスチェックを定義すると、Dockerがそのサービスの「健全性」を定期的に確認します。condition: service_healthy を組み合わせると、ヘルスチェックが成功してから依存サービスを起動できます。

depends_on の condition の違い

condition 意味 用途
service_started コンテナが起動した(デフォルト) 起動順だけ制御したい場合
service_healthy ヘルスチェックが成功した DBやAPIの準備完了を待つ場合
service_completed_successfully コンテナが正常終了した 初期化スクリプトの完了を待つ場合

チェックポイント: DBへの接続が必要なサービスには condition: service_healthy を使いましょう。service_started だけでは接続タイミングの問題は解決しません。

実際の設定サンプル


services:
  db:
    image: mysql:8.4
    healthcheck:
      test: ["CMD", "mysqladmin", "ping", "-h", "localhost"]
      interval: 10s
      timeout: 5s
      retries: 5
  app:
    depends_on:
      db:
        condition: service_healthy

interval: 10s で10秒ごとに確認し、retries: 5 で5回失敗するまで待機します。docker compose ps でヘルスチェックの状態(healthy/unhealthy/starting)を確認できます。

まとめ & 次のステップ

  • depends_on だけでは「サービスが準備完了か」は判定できない
  • healthcheck でサービスの準備状態を定期確認する
  • condition: service_healthy で健全性が確認できてから起動順を制御する
  • docker compose ps でヘルスチェック状態を確認する

次回は「開発用と本番用の分離」を学びます。同じCompose設定を開発と本番で使い回すリスクと、安全に分離する方法を整理します。

Related Articles