『手元で本番に近い環境を再現する』が現代の標準
Docker Compose は複数コンテナを宣言的にまとめて起動するツールで、ローカル開発の生産性を大きく上げます。本記事では編集部の視点で、実務で使える構成テクニックを公開情報をもとに整理します。Kubernetes 本番運用 もご参考に。
基本構成
(1) compose.yaml:services / networks / volumes の3つが基本。(2) profiles:起動するサービスを切り替え。(3) override ファイル:開発/CI で設定を上書き。(4) .env:環境変数を集約。(5) healthcheck:起動順序の制御に必須。
依存サービスの起動順序
(1) depends_on + condition: service_healthy:DBが起動するまで待つ。(2) healthcheck の test:実際に接続できるか検証。(3) retry/timeout:CI で起動遅延に耐性。(4) init: true:シグナル処理を正常化。(5) restart: unless-stopped:開発時の再起動を制御。
開発生産性を上げる設定
(1) volumes でホットリロード:ソースコードをマウント。(2) watch (Compose v2.22+):ファイル変更で自動再ビルド。(3) tmpfs:テスト時の高速ファイルシステム。(4) キャッシュレイヤー:node_modules を named volume に。(5) BuildKit:マルチステージビルドの並列化。Next.js 実践 もご参考に。
マルチサービス開発の実例
(1) Web (Next.js) + API (Fastify) + DB (Postgres) + Redis。(2) 逆プロキシ (Caddy/Traefik):1ドメインで複数サービスを束ねる。(3) seed データ:初期投入を Init コンテナで。(4) マイグレーション:Web起動前に1回実行。(5) Mailhog / MinIO:メール/S3代替で完結環境。
本番との差分管理
(1) compose.yaml は開発用:本番は k8s/ECS。(2) Dockerfile は共通:マルチステージで両対応。(3) 環境変数の差分を明示。(4) ボリュームの差分:開発はマウント、本番は永続化ストレージ。(5) セキュリティ設定の差分:本番は厳格化。Terraform 実践 も合わせて。
失敗しがちなパターン
(1) 依存サービスが起動前にAPIが立ち上がる:healthcheck 未設定。(2) node_modules がコンテナとホストで競合:named volume 未使用。(3) ポート競合:3000/5432 等の衝突。(4) ボリュームのパーミッション:UID不一致でEACCES。(5) 巨大イメージ:マルチステージで分離せず数GB。対策は、(1)healthcheck+depends_on、(2)named volume、(3)ポート可変化、(4)UID統一、(5)マルチステージ、です。