Featured image of post Dockerヘルスチェックとコンテナ監視のベストプラクティス

Dockerヘルスチェックとコンテナ監視のベストプラクティス

HEALTHCHECK命令、curl vs TCPチェック、スタートアッププローブ、docker-compose設定、監視統合、ゼロダウンタイムデプロイまで包括的に解説するコンテナヘルスケアの決定版。

Dockerヘルスチェックは、自己修復型のコンテナインフラを構築する上で不可欠です。アプリケーションの障害を自動検出し、コンテナの再起動をトリガーすることで、サービスの可用性を維持します。このガイドでは、基本的なHEALTHCHECKの実装から本番環境向けの高度なパターンまでをカバーします。

HEALTHCHECK命令

DockerfileのHEALTHCHECK命令は、コンテナが正しく機能しているかをテストする方法をDockerに指示します:

HEALTHCHECK --interval=30s --timeout=3s --start-period=40s --retries=3 \
  CMD curl -f http://localhost:3000/health || exit 1

Dockerは3つの状態を追跡します:starting(起動中)、healthy(正常)、unhealthy(異常)。--start-periodは起動の遅いアプリケーションにとって重要で、初期化中の失敗を抑制します。

オプションデフォルト説明
--interval30sチェック間隔
--timeout30sタイムアウト
--start-period0s起動時の猶予期間
--retries3失敗許容回数

Curl vs TCP vs カスタムチェック

チェック方法の選択はアプリケーションの種類に依存します:

# HTTPチェック(最も一般的)
HEALTHCHECK CMD curl -f http://localhost:8080/api/health || exit 1

# TCPソケットチェック(軽量)
HEALTHCHECK CMD nc -z localhost 5432 || exit 1

# カスタムスクリプト(複雑なロジック)
HEALTHCHECK CMD /usr/local/bin/healthcheck.sh

HTTPチェックはステータスコードとレスポンスボディを検証します。TCPチェックはプロトコル非依存で軽量です。カスタムスクリプトはデータベース接続やキャッシュ応答性など、アプリケーション固有のロジックを実装できます。

3プローブモデル

Docker ComposeとSwarmはKubernetes由来の3プローブモデルをサポートしています:

services:
  app:
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/ready"]
      interval: 10s
      timeout: 5s
      retries: 3
      start_period: 60s

スタートアッププローブは起動の遅いアプリを扱い、レディネスプローブはトラフィックルーティングの可否を制御し、ライブネスプローブは障害時に再起動をトリガーします。


Docker Compose設定

docker-compose.ymlでのヘルスチェック設定と依存関係の順序付け:

services:
  db:
    image: postgres:16
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres"]
      interval: 5s
      timeout: 3s
      retries: 5

  app:
    image: myapp:latest
    depends_on:
      db:
        condition: service_healthy
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:3000/health"]

depends_oncondition: service_healthyを組み合わせることで、データベースの準備が整うまでアプリコンテナが起動しないように制御できます。

監視とアラート統合

ツール目的統合方法
Prometheusメトリクス収集cAdvisor経由
Grafana可視化ヘルスダッシュボード
Docker Events APIリアルタイムアラートコンテナ状態ストリーム
cAdvisorリソース監視公開メトリクスエンドポイント

docker events --filter event=health_statusでヘルス状態の変更をストリーム監視できます。本番環境では、ヘルスステータスをアラートシステムにルーティングして、コンテナ異常時にチームへ通知する仕組みを構築しましょう。

まとめ

適切なヘルスチェック設定は、信頼性の高いDockerデプロイの基盤です。HEALTHCHECKに依存関係認識型のオーケストレーションと監視統合を組み合わせることで、障害を自動検出・回復し、ダウンタイムを最小化するシステムを構築できます。