必须对容器内存和CPU做硬性限制:内存需用-m和--memory-swap配平禁用swap,CPU优先用--cpus设硬边界;docker-compose中须置于deploy.resources.limits下。

关键在于对内存和CPU做硬性限制,尤其是内存——不设限就可能触发OOM Killer杀掉整个容器,宿主机也会卡死。
内存限制必须设,且要配平swap
用 -m(或 --memory)强制设定物理内存上限,比如 docker run -m 1g nginx 表示最多用1GB物理内存。同时必须配 --memory-swap,建议值与 -m 相同,例如 --memory-swap=1g。这样能禁用 swap 扩容,避免内存超支后疯狂换页拖垮系统。不推荐只设 -m 却放任 swap,那等于没限。
CPU优先用 --cpus 做硬限制
--cpus 是最直观有效的CPU控制方式,支持小数,直接对应核心数。比如宿主机有4核,docker run --cpus=1.2 nginx 就表示该容器最多占用1.2个逻辑CPU的计算时间。它底层等价于设置 cgroups 的 cpu.cfs_quota_us / cpu.cfs_period_us,是真正的硬边界。相比 --cpu-shares(仅在争抢时生效),--cpus 在空闲和高负载下都稳定生效,更适合生产环境。
组合使用 + 持续监控才可靠
单靠启动参数不够,得配合运行时观察:
- 用
docker stats实时看 CPU%、MEM USAGE / LIMIT、NET I/O 等,确认是否贴近上限 - 用
docker inspect 容器名查HostConfig.Memory和NanoCpus字段,验证配置已生效 - 上线前做压测,按应用实际峰值(如P95内存占用)上浮20%设限,避免一刀切过严导致功能异常
docker-compose 中的写法要放在 deploy 下
如果用 docker-compose 部署,资源参数不能写在服务根层级,必须嵌套在 deploy 块里,且仅在 Swarm 模式下生效。例如:
version: '3.8'
services:
web:
image: nginx
deploy:
resources:
limits:
cpus: '1.0'
memory: 512M











