Docker Containerのリソース制限を設定する

--memoryと--cpusフラグを使用してDocker containerのCPUおよびメモリリソースを制限する方法を学びます。リソース制約、OOM動作、本番環境でのサイジング戦略について解説します。

Real-World Stacks

詳細な説明

Containerのリソース消費を制御する

デフォルトでは、Docker containerはホストリソースを無制限に使用できます。--memory--cpusフラグは上限を設定し、単一のcontainerがホストを独占するのを防ぎます:

docker run -d \
  --memory 512m \
  --cpus 1.5 \
  --name api \
  my-api-image

このcontainerは最大512 MBのRAMと1.5 CPUコアを使用できます。

メモリ制限

--memory 256m      # 256メガバイト
--memory 1g        # 1ギガバイト
--memory 2g        # 2ギガバイト

containerがメモリ制限を超えると、LinuxのOOM(Out of Memory)キラーがcontainerを終了します。Dockerはこれを終了コード137(128 + SIGKILLシグナル9)として報告します。

メモリリザベーション(ソフトリミット)

docker run -d --memory 1g --memory-reservation 512m my-app

リザベーションはソフトリミットです。Dockerは通常条件下でcontainerのメモリを512 MB以下に維持しようとしますが、ハードリミットの1 GBまでのバーストを許可します。

CPU制限

--cpus 0.5         # 1つのCPUコアの半分
--cpus 1           # 1つのCPUコア
--cpus 2           # 2つのCPUコア
--cpus 4           # 4つのCPUコア

--cpusフラグはCPU時間の合計を制限します。--cpus 1.5のcontainerは、任意の数の物理コアにわたって1.5コア相当を使用できます。

CPUシェア(相対的な重み付け)

ハードリミットではなく相対的な優先順位付けには--cpu-sharesを使用します:

docker run -d --cpu-shares 1024 --name high-priority my-app
docker run -d --cpu-shares 512 --name low-priority my-worker

CPUシェアはcontainerがCPU時間を奪い合う場合にのみ重要です。ホストがアイドル状態の場合、低シェアのcontainerでもフルCPUアクセスが得られます。

実用的なリソース設定

# 小規模マイクロサービス
docker run -d --memory 256m --cpus 0.5 --name auth-service auth-image

# 中規模APIサーバー
docker run -d --memory 1g --cpus 2 --name api-server api-image

# データベースサーバー
docker run -d --memory 4g --cpus 4 --name database postgres:16

# バックグラウンドワーカー
docker run -d --memory 512m --cpus 1 --name worker worker-image

# メモリ集約型処理
docker run --memory 8g --cpus 8 --name batch-job batch-image

リソース使用量のモニタリング

# リアルタイム統計
docker stats

# 特定containerの統計
docker stats my-container

# ワンショット(ストリーミングなし)
docker stats --no-stream

Swapとメモリの動作

# swapを完全に無効化(予測可能なパフォーマンスのために推奨)
docker run --memory 512m --memory-swap 512m my-app

# 512m RAM + 512m swap(合計1g)を許可
docker run --memory 512m --memory-swap 1g my-app

--memory-swap--memoryと同じ値に設定すると、containerのswapが実質的に無効になります。レイテンシに敏感なサービスに推奨されます。

ユースケース

共有サーバーで複数のサービスを実行する際、1つのサービスのメモリリークが他のすべてのサービスをクラッシュさせることを防ぐために、各containerを定義されたリソース境界内に収める場合に使用します。

試してみる — Docker Run Command Builder

フルツールを開く