計算ツール
ITDockerCompose現場実務

Docker Composeリソース 計算ツール|CPU/RAM合計とホスト推奨スペックを即算出

Docker Composeのサービス構成から合計CPU/RAMと推奨ホストスペック(EC2/GCE/オンプレ)を自動算出。deploy.resources指定、cgroups v2、OOM Killer、swap抑制、リソース割当のベストプラクティスを解説。Compose Specification/OCI Runtime/Docker Engine の公式仕様に基づき、開発・ステージング環境の設計、本番Kubernetes移行を見据えた実務ガイドとして活用できます。

最終更新:2026-07-28/監修:計算ツールズ編集部

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)
RAM256M256メビバイト(=256×1024²)
RAM2G2ギビバイト(=2×1024³)
RAM1500m1500ミリバイト(=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 statscadvisorを使います。

OOM Killer と swap 抑制

OOM Killer の挙動

ホストRAMが枯渇するとカーネルが最もメモリを消費しているプロセスを強制終了します。コンテナ内の場合はPID 1(コンテナのメインプロセス)が終了し、コンテナ全体が再起動される挙動が一般的。Docker Composeでrestart: alwaysrestart: unless-stoppedを指定するとdockerdが自動再起動しますが、根本原因(メモリリークや過負荷)を解消しないと再起動ループになります。

swap 抑制の重要性

LinuxのswapoutはディスクI/Oが発生してレイテンシが100〜1000倍悪化します。DBサーバ・低レイテンシAPIではvm.swappiness=1(実質swap無効化)または swap partition/file を削除する運用が定石。コンテナ内はmemswap_limit: -1指定でswap全許可も可能ですが、通常はmemorymemswap_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.350-128MB静的配信のみなら軽量
Node.js API0.5-1.0256-512MBV8ヒープに応じて調整
Ruby on Rails0.5-2.0512-1500MBPumaワーカー数×スレッド
Django/Flask(Python)0.5-1.5300-800MBGunicorn+Gevent構成
PHP-FPM(Laravel/WP)0.5-2.0400-1000MBプロセス数×PHPメモリ制限
PostgreSQL 160.5-2.01024-4000MBshared_buffers=25%RAM目安
MySQL 80.5-2.01024-4000MBinnodb_buffer_pool_size中心
Redis 70.2-0.5128-1024MBmaxmemory設定で上限固定
Elasticsearch 81.0-2.02000-4000MB-Xms/-Xmx=RAMの50%程度
Kafka + ZooKeeper1.0-2.02000-4000MBKRaft移行推奨
Prometheus0.3-1.0512-2000MBretention/scrape間隔で変動
Grafana0.1-0.3128-256MBダッシュボード数依存
MongoDB 70.5-2.01500-4000MBWiredTiger cache設計必須

推奨ホストスペックとインスタンス選定

合計リソースからインスタンス選定

合計CPU合計RAMAWS EC2 目安GCP Compute 目安
1-2 vCPU1-2 GBt3.small / t4g.smalle2-small
2-4 vCPU2-4 GBt3.medium / t4g.mediume2-medium
2-4 vCPU4-8 GBt3.large / m6i.largee2-standard-2
4-8 vCPU8-16 GBm6i.xlarge / c6i.xlargee2-standard-4
8-16 vCPU16-32 GBm6i.2xlargee2-standard-8
16+ vCPU32+ GBm6i.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変換ツール

Komposekompose.io)でcompose.yamlからDeployment/Service/PersistentVolumeClaimマニフェストを自動生成できます。ただし変換結果はそのまま本番投入せず、Probeやリソース制約、シークレット管理を手動で追記する前提。Helm/Kustomizeで環境別に構成を分離するのが実務のベストプラクティスです。

リソース記法の対応関係

Composeのdeploy.resources.limits.cpusはK8sのresources.limits.cpureservationsrequestsに対応。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 SSD10,000-50,000汎用開発環境
NVMe SSD100,000-500,000本番DB・キャッシュ
AWS EBS gp33,000-16,000 (可変)汎用EC2ボリューム
AWS EBS io2最大256,000高性能DB向け
AWS EFS7,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とリソース制御の詳細情報は、以下の公式ドキュメント・団体資料を参照してください。

※本ページの推奨スペックは一般的な目安であり、実際のワークロードやアクセスパターン、SLA要求により大きく変動します。本番運用のサイジングは、負荷試験(k6・Locust・JMeter)とAPM(Datadog・New Relic・Elastic APM等)による実測データを優先し、CPU/Memory使用率・GC頻度・スロットリング発生状況を総合的に評価してください。

よくある質問(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指定で必要サービスのみ起動する運用が現実的。