最标准方式是docker-compose.yml中配置deploy.resources.limits,但需区分环境:单机用mem_limit和cpus,集群用deploy.resources.limits/reservations;注意单位大小写、cpus必须字符串、内存合理设限。
直接在 docker-compose.yml 里配 deploy.resources.limits 就行,这是最标准、最可靠的方式。注意:是否生效取决于你用的是 docker-compose up 还是 docker stack deploy —— 后者才完整支持 deploy 全套字段。
单机开发环境(docker-compose up)用顶层字段
不启用 Swarm 时,deploy 下的配置会被忽略。此时应使用服务级的直连字段:
-
内存限制:用
mem_limit: 512m(单位支持b、k、m、g) -
CPU 限制:用
cpus: '0.5'(小数表示核数,'0.5'= 半核)
示例:
version: '3.8'
services:
api:
image: python:3.11-slim
mem_limit: 1g
cpus: '1.2'
生产集群环境(docker stack deploy)用 deploy.resources
启用 Swarm 模式后,deploy 才真正起作用。推荐写法更清晰,且支持软硬双限:
-
硬限制(必须遵守):
limits.memory和limits.cpus—— 超过会触发 OOM Killer 或被 CPU 调度器节流 -
软预留(调度参考):
reservations.memory和reservations.cpus—— 告诉调度器“我至少需要这么多”,但不强制保障
示例:
version: '3.8'
services:
web:
image: nginx:alpine
deploy:
resources:
limits:
cpus: '0.8'
memory: 768m
reservations:
cpus: '0.3'
memory: 256m
关键细节和避坑提醒
这些点容易出错,务必留意:
-
memory单位写512m或512M都可以,但不能写成512MB(大小写敏感,只认m/M、g/G等) -
cpus必须是字符串类型,写成0.5(数字)会报错,正确写法是'0.5'或"0.5" - 内存设太高(比如超过宿主机物理内存 50%)可能引发系统级 OOM,建议单容器
mem_limit不超过总内存的 1/4~1/3 - 想精确控制 CPU 时间片,底层对应
CpuQuota/CpuPeriod;例如cpus: '0.5'默认等价于CpuQuota=50000,CpuPeriod=100000(即每 100ms 最多用 50ms)
验证限制是否生效
启动后用 docker inspect 查看实际设置:
docker inspect <container_name> | grep -A 5 "HostConfig"
输出中找:
-
"MemoryLimit": 1073741824→ 对应1g -
"CpuQuota": 50000, "CpuPeriod": 100000→ 对应cpus: '0.5'
运行中还可实时观察:docker stats 显示当前 CPU% 和 MEM USAGE,对比限制值是否被卡住。


















