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.ymldeploy.resources.limits(Swarm)またはmem_limit/cpus(非Swarm)でCompose設定、④docker update --memory --cpusで実行中コンテナの制限変更・OOMKilledフラグでOOM死亡確認、⑤WordPress/MySQL/Nginxの適切なメモリ割り当て・cAdvisorでコンテナリソース監視の手順で設定します。

お気軽にご相談ください

お見積りへ お問い合わせへ