首页/云/Docker 容器速查/容器默认没有资源限制
资源与安全50 条

容器默认没有资源限制

容器默认可使用宿主全部 CPU 与内存:不显式限制时,单个异常进程就可能拖垮整机,上线前应按服务画像设置限制基线。

Docker 容器速查云更新于 2026-10-13

默认状态说明

容器默认没有资源上限:不写任何限制时,它可以占用宿主机的全部 CPU 与内存。于是单个服务的内存泄漏或死循环就足以把整台机器拖垮,连带同宿主上的其他容器一起受影响。常规做法是按服务画像设置基线,给出内存硬限与 CPU 配额,必要时再加进程数上限,然后按压测与监控结果微调。

基本信息

默认状态CPU 无上限、内存无上限
主要风险单容器故障放大为整机故障
基线组合--memory / --cpus / --pids-limit
查看方式docker inspect 的 HostConfig 对应字段
生效时机创建容器时写入,改动用 docker update

典型使用场景

  • 上线前给每个服务定内存与 CPU 上限,避免互相抢占
  • 多团队共用宿主时做基本隔离
  • 排查偶发整机卡死:先确认是否缺少限制
  • 容器被 OOM 杀掉后回看当时的限制值
  • 容量规划:按容器实际用量反推宿主规格

检查与设置基线

检查与设置基线
# 查看运行中容器是否设置了限制
docker inspect -f '{{.Name}} mem={{.HostConfig.Memory}} cpu={{.HostConfig.NanoCpus}} pids={{.HostConfig.PidsLimit}}' $(docker ps -q)
# 创建时给出基线限制
docker run -d --name api --memory=512m --cpus=1.5 --pids-limit=256 app/api:1.4.2
# 观察实际用量后再微调
docker stats --no-stream --format '{{.Name}} {{.MemUsage}} {{.CPUPerc}}'

参数含义对照

参数含义备注
--memory内存硬上限超过会被内核杀掉,退出码常见 137
--cpusCPU 配额可为小数,1.5 表示最多 1.5 个核
--pids-limit进程与线程数上限防御 fork 炸弹,注意语言运行时线程数
--memory-swap交换区上限需与 --memory 一起理解,默认行为与版本相关
限制从粗到细逐层加:先给内存与 CPU 上限,再按压测与线上监控微调,避免一次定得过死导致频繁被限流或被杀。
docker update 可以在不重建容器的情况下调整部分资源限制,但并非所有字段都支持,改完用 inspect 确认实际生效的值。
限制值的单位要写清:--memory=512m 是 512MiB,写成 512 会被当成字节量,与预期相差极大。

易错点

  • 测试环境不做限制、生产突然限死:容量结论无法迁移,上线后频繁出现 OOM 或性能骤降
  • 限了内存却没同步调整应用自身的堆或缓存参数:进程被内核杀掉,应用日志里看不到异常
  • --pids-limit 设得过低:Java、Go 等运行时的线程数较多,会以创建线程失败的形式报错
  • 只看 docker stats 的瞬时值定限制:应结合一段时间内的峰值与高分位数据,否则正常波动就会触发限流

数据来源与参考

  • Docker 官方文档:Runtime options with Memory, CPUs, and GPUs(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌