容器资源限制

Docker 容器的 CPU、内存、磁盘 I/O 等资源限制


📋 目录


CPU 限制

—cpus

限制容器使用的 CPU 数量。

# 限制使用 1 个 CPU
docker run --cpus="1.0" nginx:latest
 
# 限制使用 0.5 个 CPU
docker run --cpus="0.5" nginx:latest
 
# 限制使用 2.5 个 CPU
docker run --cpus="2.5" nginx:latest

—cpu-shares

设置 CPU 权重(相对优先级)。

# 设置 CPU 权重(默认 1024)
docker run --cpu-shares=512 nginx:latest
 
# 高优先级容器
docker run --cpu-shares=2048 nginx:latest

—cpuset-cpus

限制容器使用特定的 CPU 核心。

# 使用 CPU 0 和 1
docker run --cpuset-cpus="0,1" nginx:latest
 
# 使用 CPU 0-3
docker run --cpuset-cpus="0-3" nginx:latest

—cpu-period 和 —cpu-quota

精确控制 CPU 使用时间。

# 限制使用 50% CPU
docker run --cpu-period=100000 --cpu-quota=50000 nginx:latest

内存限制

-m / —memory

限制容器使用的内存。

# 限制使用 512MB 内存
docker run -m 512m nginx:latest
 
# 限制使用 1GB 内存
docker run -m 1g nginx:latest
 
# 限制使用 2GB 内存
docker run --memory="2g" nginx:latest

—memory-swap

限制内存和交换空间的总和。

# 内存 512MB,交换空间 1GB(总计 1.5GB)
docker run -m 512m --memory-swap=1g nginx:latest
 
# 禁用交换空间
docker run -m 512m --memory-swap=512m nginx:latest
 
# 不限制交换空间(危险)
docker run -m 512m --memory-swap=-1 nginx:latest

—oom-kill-disable

禁用 OOM Killer(不推荐)。

# 禁用 OOM Killer
docker run -m 512m --oom-kill-disable nginx:latest

磁盘 I/O 限制

—device-read-bps

限制设备的读取速度。

# 限制读取速度为 1MB/s
docker run --device-read-bps /dev/sda:1mb nginx:latest

—device-write-bps

限制设备的写入速度。

# 限制写入速度为 1MB/s
docker run --device-write-bps /dev/sda:1mb nginx:latest

—device-read-iops

限制设备的读取 IOPS。

# 限制读取 IOPS 为 1000
docker run --device-read-iops /dev/sda:1000 nginx:latest

—device-write-iops

限制设备的写入 IOPS。

# 限制写入 IOPS 为 1000
docker run --device-write-iops /dev/sda:1000 nginx:latest

资源监控

docker stats

实时查看容器资源使用情况。

# 查看所有容器的资源使用
docker stats
 
# 查看指定容器
docker stats my-container
 
# 只显示一次(不持续更新)
docker stats --no-stream
 
# 按格式输出
docker stats --format "table {{.Container}}\t{{.CPUPerc}}\t{{.MemUsage}}"

docker inspect

查看容器的资源限制配置。

# 查看 CPU 限制
docker inspect -f '{{.HostConfig.CpuShares}}' my-container
docker inspect -f '{{.HostConfig.NanoCpus}}' my-container
 
# 查看内存限制
docker inspect -f '{{.HostConfig.Memory}}' my-container
docker inspect -f '{{.HostConfig.MemorySwap}}' my-container

资源配额管理

更新资源限制

# 更新 CPU 限制
docker update --cpus="2.0" my-container
 
# 更新内存限制
docker update --memory="1g" my-container
 
# 更新多个限制
docker update --cpus="2.0" --memory="1g" my-container

Docker Compose 中的资源限制

version: '3.8'
services:
  web:
    image: nginx:latest
    deploy:
      resources:
        limits:
          cpus: '1.0'
          memory: 512M
        reservations:
          cpus: '0.5'
          memory: 256M

最佳实践

1. 合理设置资源限制

# 根据应用需求设置
docker run -d \
  --name web \
  --cpus="1.0" \
  --memory="512m" \
  nginx:latest

2. 监控资源使用

# 定期检查资源使用情况
docker stats --no-stream

3. 预留资源

# 为系统预留资源
# 不要将所有 CPU/内存分配给容器

4. 使用资源限制防止资源耗尽

# 防止单个容器占用过多资源
docker run --cpus="2.0" --memory="1g" myapp:latest

常见问题

1. 容器被 OOM Killer 杀死

问题:容器内存使用超过限制。

解决

  • 增加内存限制
  • 优化应用内存使用
  • 检查内存泄漏

2. CPU 使用率过高

问题:容器占用过多 CPU。

解决

  • 设置 CPU 限制
  • 优化应用性能
  • 使用 CPU 权重分配优先级

3. 磁盘 I/O 过高

问题:容器磁盘 I/O 过高。

解决

  • 设置磁盘 I/O 限制
  • 优化应用 I/O 操作
  • 使用 SSD 存储

📚 参考资源


相关笔记