Docker Composeリソース 計算ツール|CPU/RAM合計とホスト推奨スペックを即算出
Docker Composeのサービス構成から合計CPU/RAMと推奨ホストスペック(EC2/GCE/オンプレ)を自動算出。deploy.resources指定、cgroups v2、OOM Killer、swap抑制、リソース割当のベストプラクティスを解説。Compose Specification/OCI Runtime/Docker Engine の公式仕様に基づき、開発・ステージング環境の設計、本番Kubernetes移行を見据えた実務ガイドとして活用できます。
Docker Composeリソースツール
Composeリソース計算の基本
基本の考え方
合計CPU = Σ(サービス毎の想定CPU × レプリカ数)
合計RAM = Σ(サービス毎の想定RAM × レプリカ数)
ホスト推奨 = 合計 × 1.3〜1.5(余裕係数)
Docker Composeは複数コンテナを1つのcompose.yamlファイルで宣言的に定義するオーケストレーションツール。開発環境、CI、ステージング、小規模本番で広く使われます。ホストスペックの見積は、全サービスのCPU/RAMを合算し、余裕係数1.3〜1.5倍で算定するのが業界標準の実務目安です。
負荷特性による補正
- アイドル多め(Webアプリ):合計×1.2倍程度で十分
- 継続的な負荷(バッチ・DB):合計×1.5〜2倍
- スパイク型(API・ジョブ):ピーク時想定で1.5倍
- 本番運用:SLA目標に応じてCPU使用率50-70%が上限になるよう2倍見積
OSと Docker daemon の消費
ホストOS(Linux+systemd)とDocker daemon(dockerd+containerd)はベースで500MB〜1GBのRAM、CPU 0.2〜0.5コアを常時消費します。特にログ集約(fluentd/fluentbit)、モニタリング(Prometheus/Node Exporter)を同居させる場合は追加で1〜2GB。ホストサイジング時は差し引いて計算しましょう。
deploy.resources の書き方
基本記法(Compose Specification)
services:
web:
image: nginx:1.27-alpine
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M
reservations:
cpus: '0.25'
memory: 128M
limitsは上限(超えたらCPUスロットリング/OOM Kill)、reservationsは保証量(この分は必ず確保)です。Compose Specification(旧: version 3)以降の標準記法。docker compose upで起動する場合は limits/reservations の両方が有効ですが、Swarmモードのdocker stack deploy 以外では reservations は「予約」扱いで実強制されない点に注意(cgroupsによるCPU shares/memory reservationとして反映)。
単位表記
| 項目 | 表記例 | 意味 |
|---|---|---|
| CPU | '0.5' | 0.5コア(=500m/millicore) |
| CPU | '2' | 2コア(=2000m) |
| RAM | 256M | 256メビバイト(=256×1024²) |
| RAM | 2G | 2ギビバイト(=2×1024³) |
| RAM | 1500m | 1500ミリバイト(=1.5B・非推奨) |
legacy: cpus / mem_limit
Compose v2以前で使われた cpus: 0.5 / mem_limit: 512m は非推奨だが後方互換で動作します。新規プロジェクトはdeploy.resources.limits形式で書きましょう。docker compose(Compose V2)はKubernetes記法との親和性を高める方向に進化しています。
cgroups v1/v2 とリソース制御
cgroups v1(Legacy)
2007年から使われるLinux Control Groupsの初代実装。CPU/memory/blkio/pidsが独立した階層で管理され、細かな制御が可能ですが設定が複雑。CentOS 7・Ubuntu 20.04以前はv1がデフォルト。Docker Engineは自動でどちらのバージョンかを検出して制御を行います。
cgroups v2(Unified Hierarchy)
Linux 4.5(2016年)で導入、5.8で本流採用された次世代版。全リソースを1つの階層で管理し設定がシンプル。RHEL 9・Ubuntu 22.04以降がv2デフォルト。Kubernetes 1.25以降も推奨。Docker 20.10以降でv2完全対応、systemd/dockerdの連携でリソース制御の一貫性が向上しました。
CPUスロットリング
cpus: 0.5を指定するとcgroupsでcpu.cfs_quota_us=50000, cpu.cfs_period_us=100000が設定され、100ms周期のうち50msだけCPUを使える計算に。上限に達すると次期スケジューリング周期まで待たされ、レイテンシー増加の原因になります。過度なCPU limits は避け、reservationsとの併用が実務ベストプラクティス。
Memory OOM protection
コンテナがmemory limitを超えるとカーネルのOOM KillerがSIGKILLでプロセス終了。Compose定義にはoom_kill_disableもありますが、本番運用では有効化せず、memory.reservationで保証量を確保、監視で90%到達を早期検知するのが定石。RSS/Cache の内訳把握にはdocker statsやcadvisorを使います。
OOM Killer と swap 抑制
OOM Killer の挙動
ホストRAMが枯渇するとカーネルが最もメモリを消費しているプロセスを強制終了します。コンテナ内の場合はPID 1(コンテナのメインプロセス)が終了し、コンテナ全体が再起動される挙動が一般的。Docker Composeでrestart: alwaysやrestart: unless-stoppedを指定するとdockerdが自動再起動しますが、根本原因(メモリリークや過負荷)を解消しないと再起動ループになります。
swap 抑制の重要性
LinuxのswapoutはディスクI/Oが発生してレイテンシが100〜1000倍悪化します。DBサーバ・低レイテンシAPIではvm.swappiness=1(実質swap無効化)または swap partition/file を削除する運用が定石。コンテナ内はmemswap_limit: -1指定でswap全許可も可能ですが、通常はmemoryとmemswap_limitを同じ値にしてswap使用を防止します。
監視・アラート設計
- ホスト全体:Memory usage 80%超で警告、90%超で緊急
- コンテナ単位:memory limits の70%超で警告、90%で緊急
- OOM Killer発火:
dmesg | grep -i oomで検知、Prometheusでnode_vmstat_oom_killメトリクス監視 - swap使用:常時0を目標。使用開始をアラート発火条件に
主要スタック別リソース目安
Docker Composeで頻用される代表的なスタックの1インスタンスあたりCPU/RAM目安です。負荷・データ量で大きく変動しますが、開発環境やスモールスタート本番の初期見積として参考にしてください。
| サービス | CPU目安 | RAM目安 | 備考 |
|---|---|---|---|
| Nginx(リバースプロキシ) | 0.1-0.3 | 50-128MB | 静的配信のみなら軽量 |
| Node.js API | 0.5-1.0 | 256-512MB | V8ヒープに応じて調整 |
| Ruby on Rails | 0.5-2.0 | 512-1500MB | Pumaワーカー数×スレッド |
| Django/Flask(Python) | 0.5-1.5 | 300-800MB | Gunicorn+Gevent構成 |
| PHP-FPM(Laravel/WP) | 0.5-2.0 | 400-1000MB | プロセス数×PHPメモリ制限 |
| PostgreSQL 16 | 0.5-2.0 | 1024-4000MB | shared_buffers=25%RAM目安 |
| MySQL 8 | 0.5-2.0 | 1024-4000MB | innodb_buffer_pool_size中心 |
| Redis 7 | 0.2-0.5 | 128-1024MB | maxmemory設定で上限固定 |
| Elasticsearch 8 | 1.0-2.0 | 2000-4000MB | -Xms/-Xmx=RAMの50%程度 |
| Kafka + ZooKeeper | 1.0-2.0 | 2000-4000MB | KRaft移行推奨 |
| Prometheus | 0.3-1.0 | 512-2000MB | retention/scrape間隔で変動 |
| Grafana | 0.1-0.3 | 128-256MB | ダッシュボード数依存 |
| MongoDB 7 | 0.5-2.0 | 1500-4000MB | WiredTiger cache設計必須 |
推奨ホストスペックとインスタンス選定
合計リソースからインスタンス選定
| 合計CPU | 合計RAM | AWS EC2 目安 | GCP Compute 目安 |
|---|---|---|---|
| 1-2 vCPU | 1-2 GB | t3.small / t4g.small | e2-small |
| 2-4 vCPU | 2-4 GB | t3.medium / t4g.medium | e2-medium |
| 2-4 vCPU | 4-8 GB | t3.large / m6i.large | e2-standard-2 |
| 4-8 vCPU | 8-16 GB | m6i.xlarge / c6i.xlarge | e2-standard-4 |
| 8-16 vCPU | 16-32 GB | m6i.2xlarge | e2-standard-8 |
| 16+ vCPU | 32+ GB | m6i.4xlarge以上 | e2-standard-16以上 |
Burstable vs 汎用インスタンス
AWS T系(t3/t4g)、GCP E2はCPU Credit方式のBurstableで、常時50%以下のCPU利用が前提。継続的なCPU負荷ではCredit枯渇でスロットリング発生し、応答時間が数倍悪化。継続負荷が予想されるDB・バッチ・ストリーミングはM系(汎用)やC系(コンピュート最適化)を選択しましょう。
ARM64(Graviton/Ampere)の活用
2024〜2026年時点で、ARM64インスタンス(AWS Graviton3/4・GCP Tau T2A)は同スペックのx86_64より20-40%安く、消費電力・熱発生も少ない。多くの人気イメージ(node/nginx/postgres/redis)がmulti-archで提供されており、docker buildxでARM64ビルドすればコスト削減が可能。ネイティブモジュールを含むアプリ(Node.jsのbcrypt等)はビルド確認が必要です。
Kubernetesへの移行指針
Composeが手狭になる兆候
①複数ホストへスケール、②ローリングアップデートが必要、③自動回復・スケーリングが必要、④サービスメッシュ導入のいずれか1つでもあればComposeでは限界。Docker Swarmで凌ぐ選択肢もありますが、コミュニティ活動が停滞気味のため、新規プロジェクトはKubernetes(K8s)または軽量K8s(K3s・k0s)への移行が主流です。
Compose → K8s変換ツール
Kompose(kompose.io)でcompose.yamlからDeployment/Service/PersistentVolumeClaimマニフェストを自動生成できます。ただし変換結果はそのまま本番投入せず、Probeやリソース制約、シークレット管理を手動で追記する前提。Helm/Kustomizeで環境別に構成を分離するのが実務のベストプラクティスです。
リソース記法の対応関係
Composeのdeploy.resources.limits.cpusはK8sのresources.limits.cpu、reservationsはrequestsに対応。CPUは同じくmillicore単位(500m=0.5コア)で表現されるため、大きな書き直しは不要です。ただしK8sはPod単位(複数コンテナ)でリソース管理されるため、共有関係の再設計は必須。
マネージドK8s vs 軽量K8s
マネージド(EKS/GKE/AKS)はコントロールプレーン運用が不要で本番向き。料金はコントロールプレーン月$70〜が最低ライン。軽量K8s(K3s・k0s)はシングルバイナリで数百MBのRAMでも動作、開発・エッジ・IoT向け。組織規模と運用スキルで選定します。
ネットワーク・ストレージI/Oの見積
CPU/RAM以外に、Composeスタックの全体性能を左右するのがネットワーク帯域とストレージI/Oです。特にDB・キャッシュ・ログ集約サービスはI/Oバウンドになりやすく、CPU増強しても性能が伸びないケースが頻発します。
ストレージI/Oの目安
| ストレージタイプ | IOPS目安 | 用途 |
|---|---|---|
| HDD (7200rpm) | 100-200 | アーカイブ・ログ |
| SATA SSD | 10,000-50,000 | 汎用開発環境 |
| NVMe SSD | 100,000-500,000 | 本番DB・キャッシュ |
| AWS EBS gp3 | 3,000-16,000 (可変) | 汎用EC2ボリューム |
| AWS EBS io2 | 最大256,000 | 高性能DB向け |
| AWS EFS | 7,000 (バースト) | 複数EC2共有 |
ネットワーク帯域の見積
コンテナ間通信は基本的にホストのlocal loopbackで高速ですが、外部通信はENI/仮想NICの帯域に依存。AWS EC2ならt3.medium=5Gbps、m6i.large=12.5Gbpsが上限。ストリーミング・動画配信ワークロードは帯域基準でインスタンス選定を優先しましょう。
Docker独自ネットワーク
Composeが自動作成する{project}_defaultbridgeネットワークで各サービスがサービス名で名前解決されます。overlay ネットワークは複数ホストにまたがるSwarm用途、host ネットワークはホスト直結で最高速だがポート衝突リスクあり。本番はcustom bridge推奨です。
よくある間違い・注意点
- CPU limitを厳しくかけすぎる — CPUスロットリングは応答時間を数倍悪化させます。ミッションクリティカルなAPIやDBにはlimitsを緩めに、reservationsで保証する設計が定石。cgroupsのCPU shares(相対重み)で優先度をつけるのも有効です。
- memory limitを設定しない — 未設定だとメモリリークするコンテナが全RAMを食い潰し、OOM Killerがランダムに他コンテナを殺す事故に。全サービスに必ずmemory limitを設定し、監視でしきい値到達を早期検知しましょう。
- reservations だけで安心する — reservationsは「予約」であり、docker compose upで使う限り実際のリソース強制はlimitsが担当。docker stack deploy(Swarm) やKubernetesで初めてreservationsが厳格に有効化されます。
- swap 有効環境で本番運用 — DBやリアルタイムAPIをswap有効ホストで運用すると、swapout発生時にレイテンシが100倍以上悪化。本番Linuxホストは
vm.swappiness=1または swap 削除を推奨。 - cgroups v1環境で最新機能が使えない — memory.oom.group、pids.max、CPU pressure metrics等のcgroups v2機能はv1では利用不可。RHEL 9・Ubuntu 22.04+へのアップグレードを計画しましょう。
- Compose を本番運用の唯一手段にする — 単一ホストで完結する小規模なら十分ですが、可用性・スケール・ローリング更新が必要になったらKubernetes(マネージド or 軽量)への移行を早期に検討。移行が遅れるほど負債が積み上がります。
関連する規格・仕様
- Compose Specification ― Docker Composeファイルフォーマットの公式仕様。Compose V2以降の基盤。
- OCI Runtime Specification ― Open Container Initiative(LinuxFoundation)が策定するコンテナ実行時仕様。Docker Engine・containerd・runc・CRI-Oが準拠。
- OCI Image Format Specification ― コンテナイメージの標準フォーマット。docker save/loadやDocker Hub、GHCR、GARなど各種レジストリの共通基盤。
- Kubernetes Resource Model ― CPU(millicore)・Memory(バイト単位)のリクエスト/リミット記法。Composeとの互換性のベース。
- Linux cgroups v2 API ― Linuxカーネルのリソース制御API。Docker Engine 20.10以降がv2を完全サポート。
- SPDX / SLSA ― ソフトウェア部品表(SBOM)とサプライチェーンセキュリティ。Dockerイメージのセキュリティ管理で使用。
- CIS Docker Benchmark ― Center for Internet Securityが公開するDockerホスト・コンテナのハードニング基準。
参考文献・公式資料
Docker Composeとリソース制御の詳細情報は、以下の公式ドキュメント・団体資料を参照してください。
- Docker Docs - Compose ― Docker Composeの公式ドキュメント。インストール・コマンド・compose.yaml書式の一次資料。
- Compose Specification (GitHub) ― Compose ファイル形式の正式仕様。deploy.resources 等の詳細定義。
- Docker CLI - docker compose reference ― docker compose コマンドの公式リファレンス。
- Open Container Initiative (OCI) ― コンテナランタイム・イメージフォーマットの標準化団体(LinuxFoundation)。
- Linux Kernel Documentation - cgroups v2 ― cgroups v2 のカーネル公式ドキュメント。
- Kubernetes Documentation - Resource Management ― K8sにおけるCPU/Memory requests/limitsの公式ガイド。
- Kompose - Compose to Kubernetes converter ― CNCF Sandboxプロジェクト。Compose→K8sマニフェスト変換ツール。
- CIS Docker Benchmark ― Docker運用のセキュリティ・ハードニング基準。
- Cloud Native Computing Foundation (CNCF) ― Kubernetes・containerd・Prometheus等のクラウドネイティブ技術管理団体。
- AWS EC2 インスタンスタイプ ― Docker運用時のホスト選定に使うEC2の公式スペック表。
よくある質問(FAQ)
Composeの本番運用の限界は?
Docker Composeはシングルホスト前提です。複数ホストへのスケール、自動フェイルオーバー、ローリングアップデート、サービスメッシュ導入といった要件が出た時点でKubernetes(マネージド:EKS/GKE/AKS、または軽量:K3s/k0s)への移行を検討します。開発・CI・ステージング・小規模本番までがCompose領域です。
リソース制限はどう設定する?
deploy.resources.limitsにcpus/memoryを、reservationsに保証量を指定します。例:limits: cpus: '1.0', memory: 512M / reservations: cpus: '0.25', memory: 128M。limitsを超えるとCPUスロットリングまたはOOM Kill、reservationsは保証量として扱われます。全サービスにmemory limits設定を推奨。
開発と本番でファイルを分離するには?
compose.yaml(共通)とcompose.override.yaml(開発)、compose.prod.yaml(本番)で環境別に分割し、docker compose -f compose.yaml -f compose.prod.yaml upのようにマージ実行します。環境変数は.envファイルまたは${VAR:-default}形式で外部化するのが定石です。
Composeで永続化ストレージはどう扱う?
Named Volume(volumes:宣言)またはBind Mount(./data:/var/lib/mysql)を使用。DBの本番運用ではNamed Volume+定期バックアップが定石。Bind Mountはホストのファイルシステム権限やSELinuxの影響を受けやすいのでMountオプションに注意。
Composeでhealthcheckを設定するには?
healthcheck: test: [\"CMD\", \"curl\", \"-f\", \"http://localhost/health\"] interval: 30s timeout: 10s retries: 3のように定義。depends_on: condition: service_healthyと組み合わせると、DBが起動完了してからアプリを起動する制御が可能。開発時のRace Condition対策に必須。
CPU cpus の値は何を基準に決める?
負荷試験の実測値が最も確実です。1コアあたりのRPS(req/sec)を測定し、想定ピークRPSに余裕30-50%を加えて算出。目安としてNode.js API 1コアで1000〜3000rps、PHP-FPM 1コアで100〜500rpsが指標。DBはコネクション数×CPU利用率で見積もります。
memory の値はどう見積もる?
アプリのランタイム特性で決まります。JVM(Java/Kotlin)はヒープ設定+300MB、Node.jsはV8 heap+50MB、Ruby/Pythonはワーカー数×プロセスメモリ、DBはbuffer_pool_size中心で計算。開発初期はdocker statsで実測し、その1.5倍をlimitsに設定して段階的に調整するのが実務的です。
cgroups v1とv2の違いは?
v2はUnified Hierarchy(統一階層)でリソース管理がシンプル。v1は各リソースが独立階層で複雑。RHEL 9・Ubuntu 22.04+はv2デフォルト、それ以前はv1。Docker 20.10+は両対応。v2はmemory.oom.groupやPSI(Pressure Stall Information)など運用に便利な機能があり、可能なら新規環境はv2を選択しましょう。
OOM Killerを回避する方法は?
①memory limitsを実測値の1.5倍で設定、②アプリのメモリリーク修正、③swap削除(vm.swappiness=1)、④監視で70%到達を早期通知、が基本セット。oom_kill_disable: trueはカーネルパニックのリスクがあり本番非推奨。再起動戦略(restart: unless-stopped)で自動復旧の設定を組み合わせます。
Docker Desktop vs Docker Engine の違いは?
Docker DesktopはWindows/macOS向けGUIツール(VM経由でLinuxコンテナ実行)。Docker EngineはLinuxネイティブ実行環境。企業(従業員数250人超 or 年商1000万ドル超)はDocker Desktopが有料。開発機はDesktop、本番Linuxサーバやコンテナホストはengine単体で運用が定石です。
Composeから移行しやすいK8sは?
マネージドK8sのEKS Fargate・GKE Autopilotは Node運用不要でCompose感覚に近く移行しやすい。オンプレならK3sが1バイナリで起動でき学習コスト低め。Composeファイル→K8sはKomposeで変換可能ですが、変換後はManifest手直しとHelm化を推奨します。
ARM64(Graviton)は使うべき?
x86_64比で20-40%コスト削減可能で、Nginx/Node/PostgreSQL/Redisなど主要イメージはmulti-arch対応。docker buildx build --platform linux/amd64,linux/arm64で両アーキ対応ビルドが可能。ネイティブモジュール(Node.jsのbcrypt・Pythonのnumpy等)はarm64用wheelsの存在を確認しましょう。
ケース別 Compose設計シナリオ
WordPress+MariaDB+Redis(小規模ブログ)
3サービス構成で合計約1.5vCPU・2.5GB RAM。ホストはt3.small(2vCPU/2GB)〜t3.medium(2vCPU/4GB)が目安。MariaDBに1GB・PHP-FPM 512MB・Redis 128MBを割当、Nginx(別コンテナ)100MB。標準的なテーマ・数千PV/日ならこれで十分運用可能です。
Rails+PostgreSQL+Sidekiq+Redis(SaaS)
4サービス構成で合計約4-6vCPU・6-10GB RAM。ホストはm6i.large(2vCPU/8GB)以上。Puma 4-8ワーカーで2GB・PostgreSQL 2GB・Sidekiq 512MB・Redis 512MB。DB接続プール数×ワーカー数がPostgreSQLのmax_connections(100)を超えないよう注意。
Next.js+PostgreSQL+MinIO+Prometheus(CI/CD開発環境)
開発ステージング用途で合計約4vCPU・8GB RAM。ホストはt3.large(2vCPU/8GB)〜m6i.large。Next.jsはnext dev時にRAMを大量消費(1〜2GB)、本番buildなら500MB程度。MinIOは開発時のS3代替として最小構成でOK。
マイクロサービス20個(開発全部乗せ)
20サービス×平均0.5vCPU/256MB=合計10vCPU・5GB RAM。開発機はm6i.2xlarge(8vCPU/32GB)や Macbook Pro M系推奨。docker composeでは限界に近く、Kubernetes(K3s・kind)への移行を検討する規模。開発機のリソース節約にはprofile指定で必要サービスのみ起動する運用が現実的。