Docker Containerのリソース制限を設定する
--memoryと--cpusフラグを使用してDocker containerのCPUおよびメモリリソースを制限する方法を学びます。リソース制約、OOM動作、本番環境でのサイジング戦略について解説します。
詳細な説明
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を定義されたリソース境界内に収める場合に使用します。