仅用 -m 限制物理内存不够,必须同步配置 --memory-swap(如 -m 512m --memory-swap=512m)禁用 swap,否则默认启用等量 swap 导致实际可用内存翻倍且 oom 行为不可控。
直接在启动容器时加参数就能限制 cpu 和内存,不需要改配置或装插件。关键不是“能不能”,而是选对参数、设合理值,避免容器抢资源或被系统杀掉。
内存限制:防 OOM 的核心手段
内存超限会触发内核 OOM Killer,直接杀进程导致容器退出。必须用 -m(或 --memory)硬限制物理内存上限:
- -m 512m:最多用 512MB 物理内存
- --memory-swap 512m:禁用 swap(内存+swap 总和 = 物理内存),推荐与 -m 值一致,避免 swap 拖慢性能
- --memory-reservation 256m:软限制,宿主机内存紧张时,容器会被优先压缩到这个值以下
- --oom-score-adj 500:调高该值会让容器更易被 OOM 杀死(-1000 最难杀,1000 最先杀)
CPU 限制:三种常用方式按需选
CPU 不像内存那样会立刻崩溃,但不设限会导致其他容器卡顿。主流方法有:
- --cpus 1.5:最直观,限制最多使用 1.5 个逻辑 CPU 核心(Docker 1.13+ 推荐)
- --cpuset-cpus "0,2":绑定到特定核心(如只允许用第 0 和第 2 号 CPU),适合多核隔离场景
- --cpu-shares 512:相对权重(默认 1024),仅在 CPU 竞争时生效,不设绝对上限,适合弹性调度
Docker Compose 中统一配置
批量管理时,写进 docker-compose.yml 更清晰稳定:
- 在 deploy.resources.limits 下设置:
- cpus: '0.75'(注意是字符串格式)
- memory: 384M
- memswap_limit: 384M(对应 --memory-swap)
- cpuset: '0-1'(对应 --cpuset-cpus)
验证与监控不能少
设了不等于生效,得动手确认:
- docker stats 容器名:实时看 CPU%、MEM USAGE / LIMIT
- docker inspect 容器名:查 HostConfig.Memory、HostConfig.NanoCpus 或 CpuQuota/CpuPeriod 字段
- docker exec -it 容器 cat /sys/fs/cgroup/memory/memory.limit_in_bytes:看内核实际生效的内存上限(字节)











