docker资源限制需按cpu、内存、i/o分类配置:cpu用--cpus或--cpu-shares控制算力分配;内存必须设--memory防oom;i/o需指定设备路径限速;compose中limits生效,reservations仅swarm有效。

直接写在 docker run 命令里,或者定义在 docker-compose.yml 的 deploy.resources 区域,就能生效。关键不是“怎么写语法”,而是理解每类限制的实际作用和常见组合方式。
CPU 配额:控制能用多少算力
两种常用方式,适用场景不同:
- --cpus=1.5(命令行)或 cpus: '1.5'(compose):硬性上限,容器最多用 1.5 个逻辑 CPU 核心,超了就 throttled(被节流),适合对响应延迟敏感的服务
- --cpu-shares=2048 或 cpu_shares: 2048:不设绝对上限,只在多个容器抢 CPU 时起作用——份额是 1024 的 2 倍,就大概率分到双倍时间片,适合后台批处理类任务
- 进阶配额可配合
--cpu-period=100000 --cpu-quota=50000,表示每 100ms 最多运行 50ms(即 50% CPU),等效于--cpus=0.5
内存配额:防 OOM 和资源挤占
必须设 --memory(或 mem_limit),否则容器可能吃光宿主机内存:
- --memory=512m:物理内存硬上限,超了会被内核 OOM Killer 杀掉
-
--memory-swap=1g:内存 + swap 总量上限;若只设
--memory不设 swap,swap 默认等于 memory 值;设为-1表示不限 swap(不推荐) -
--memory-reservation=256m:软限制,告诉调度器“建议预留这么多”,实际可用内存仍以
--memory为准,仅在资源紧张时生效
I/O 配额:避免磁盘拖慢整台机器
主要针对块设备(如 /dev/sda),需明确指定设备路径:
- --device-read-bps=/dev/sda:2mb:限制该容器从 sda 每秒最多读 2MB
- --device-write-iops=/dev/sda:50:限制每秒最多 50 次写 I/O 操作
- 注意:这些参数在
docker-compose.yml中暂不原生支持(v3.8+ 仍需通过command或 wrapper 脚本间接实现)
Docker Compose 写法示例
这是生产环境最常用的写法,清晰且可复用:
version: '3.8'
services:
api:
image: myapp:latest
deploy:
resources:
limits:
cpus: '1.2'
memory: 1G
# 注意:memory_swap 需通过 extra_hosts 或 runtime 配置,compose 不直接支持
reservations:
cpus: '0.5'
memory: 512M
注意:reservations 只在 Swarm 模式下真正生效;单机 docker-compose up 时,只有 limits 生效。











