2026年6月19日
2026年6月19日
Dockerのリソース制限(CPU/メモリ)を設定する方法
はじめに
DockerでWordPressコンテナを動かしているがメモリを無制限に使ってサーバーがOOMで落ちる・あるコンテナが全CPUを使って他のコンテナが遅くなる・docker-compose.ymlでリソース制限を設定する方法がわからないといった問題の解決方法を解説します。
症状・原因
- コンテナがメモリを使いすぎてホストのOOMキラーにプロセスが強制終了される
- 1つのコンテナが全CPUを専有して他のコンテナのレスポンスが遅くなる
docker statsでリソース使用量を確認したが上限設定がない状態docker-composev3とv2でリソース制限の書き方が異なり動作しない
解決手順
ステップ1:現在のリソース使用量を確認する
# ✅ 全コンテナのリソース使用量をリアルタイム確認
docker stats
# → CONTAINER CPU % MEM USAGE / LIMIT MEM %
# → wordpress 45.2% 512MiB / unlimited -
# ✅ 特定コンテナのリソース使用量
docker stats wordpress mysql --no-stream
# --no-stream: 1回だけ表示
# ✅ コンテナのリソース制限を確認
docker inspect wordpress --format='{{json .HostConfig.Memory}}'
# → 0 ← 0は無制限
# ✅ コンテナの詳細なリソース設定を確認
docker inspect wordpress | grep -A 10 '"Memory"'
ステップ2:docker run でリソース制限を設定する
# ✅ メモリ制限を設定してコンテナを起動
docker run -d \
--name wordpress \
--memory="512m" \
--memory-swap="1g" \
-p 80:80 \
wordpress:latest
# ✅ CPU 制限を設定
docker run -d \
--name wordpress \
--cpus="1.5" \
--memory="512m" \
-p 80:80 \
wordpress:latest
# --cpus="1.5": 1.5コア分のCPUを使用可能
# ✅ CPU セットを指定(物理コアを固定)
docker run -d \
--name wordpress \
--cpuset-cpus="0,1" \
--memory="512m" \
wordpress:latest
# --cpuset-cpus="0,1": CPU0とCPU1のみ使用可能
# ✅ CPU 相対シェアを設定(デフォルト1024)
docker run -d \
--cpu-shares=512 \
--name low-priority-task \
busybox sleep 3600
# 512は他のコンテナ(1024)の半分のCPU優先度
ステップ3:docker-compose.yml でリソース制限を設定する
# ✅ docker-compose.yml(Compose v3.x / Docker Swarm)
version: "3.8"
services:
wordpress:
image: wordpress:latest
ports:
- "80:80"
environment:
WORDPRESS_DB_HOST: db
WORDPRESS_DB_NAME: wordpress
deploy:
resources:
limits:
cpus: "1.0"
memory: 512M
reservations:
cpus: "0.5"
memory: 256M
depends_on:
- db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: wordpress
deploy:
resources:
limits:
cpus: "0.5"
memory: 256M
# ✅ docker-compose(非swarm)でリソース制限を適用
# docker-compose up の場合は --compatibility フラグが必要
docker-compose --compatibility up -d
# ✅ docker-compose v2 形式(非swarm)
# docker-compose.yml
services:
wordpress:
mem_limit: 512m
mem_reservation: 256m
cpus: 1.0
ステップ4:既存コンテナのリソース制限を変更する
# ✅ 実行中のコンテナのメモリ制限を変更
docker update --memory="1g" --memory-swap="2g" wordpress
# → wordpress ← 成功
# ✅ 実行中のコンテナの CPU 制限を変更
docker update --cpus="2.0" wordpress
# ✅ 複数コンテナを一度に更新
docker update --memory="512m" wordpress mysql nginx
# ✅ 変更が反映されたか確認
docker inspect wordpress --format='
Memory: {{.HostConfig.Memory}}
NanoCPUs: {{.HostConfig.NanoCpus}}'
# → Memory: 1073741824 (= 1GB in bytes)
# → NanoCPUs: 2000000000 (= 2.0 CPUs)
# ✅ OOM キラーに終了させられていないか確認
docker inspect wordpress --format='{{.State.OOMKilled}}'
# → false ← 正常
# → true ← OOMで終了された(メモリ制限が厳しすぎる)
ステップ5:WordPress コンテナのリソース最適化
# ✅ WordPress + MySQL の実用的なリソース設定
# docker-compose.yml
services:
wordpress:
image: wordpress:php8.2-fpm
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_NAME: wordpress
WORDPRESS_DB_USER: wpuser
WORDPRESS_DB_PASSWORD: wppassword
# ✅ PHP-FPM のメモリ設定
PHP_MEMORY_LIMIT: 256M
PHP_MAX_EXECUTION_TIME: 60
mem_limit: 512m
cpus: 1.0
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: rootpassword
MYSQL_DATABASE: wordpress
volumes:
- ./mysql.cnf:/etc/mysql/conf.d/custom.cnf
mem_limit: 256m
cpus: 0.5
nginx:
image: nginx:alpine
ports:
- "80:80"
- "443:443"
mem_limit: 128m
cpus: 0.25
# ✅ コンテナのリソース使用状況を継続監視
watch -n 5 'docker stats --no-stream'
# ✅ Prometheus + Grafana でコンテナを監視(本番向け)
docker run -d \
--name cadvisor \
--volume=/var/run/docker.sock:/var/run/docker.sock:ro \
--publish=8080:8080 \
gcr.io/cadvisor/cadvisor:latest
注意事項
--memory-swapは--memory以上の値を設定してください(--memory=512m --memory-swap=512mにするとスワップが無効になります。スワップ含めた上限を設定するには--memory-swap=1gのようにmemoryより大きくします)docker-composeのSwarm向けdeploy.resources設定はdocker-compose upでは通常無視されます。Swarm以外の環境ではmem_limit/cpusを使うか、--compatibilityフラグを使用してください
まとめ
Dockerのリソース制限は①docker statsでリアルタイムのCPU/メモリ使用量確認・docker inspectで現在の制限値確認、②docker run --memory="512m" --cpus="1.0"でコンテナ起動時に制限設定、③docker-compose.ymlのdeploy.resources.limits(Swarm)またはmem_limit/cpus(非Swarm)でCompose設定、④docker update --memory --cpusで実行中コンテナの制限変更・OOMKilledフラグでOOM死亡確認、⑤WordPress/MySQL/Nginxの適切なメモリ割り当て・cAdvisorでコンテナリソース監視の手順で設定します。