Docker 容器内进程占用宿主机资源怎么限制?

文章导读
在 Docker 中限制容器占用宿主机资源,最直接的方式是在启动容器时使用`--cpus`和`--memory`参数设置硬上限,或在 docker-compose 文件的deploy.resources.limits层级配置。必须同时配置`--memory-swap`禁用交换空间,否则内存超支可能触发 OOM Killer 导致宿主机卡顿。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 常见问题
  7. 参考来源
A A

在 Docker 中限制容器占用宿主机资源,最直接的方式是在启动容器时使用`--cpus``--memory`参数设置硬上限,或在 docker-compose 文件的deploy.resources.limits层级配置。必须同时配置`--memory-swap`禁用交换空间,否则内存超支可能触发 OOM Killer 导致宿主机卡顿。

先说结论:生产环境必须对容器内存和 CPU 做硬性限制,尤其是内存不设限可能拖垮宿主机。

  • 适合:多容器部署、嵌入式系统或资源紧张场景
  • 先看:宿主机总资源及容器业务峰值需求
  • 建议:配合 docker stats 持续监控验证

命令速用版

直接使用docker run启动容器时,添加以下参数即可生效,无需额外插件:

docker run -d \
  `--name` limited-nginx \
  `--cpus`="1.5" \
  `--memory`="512m" \
  `--memory-swap`="512m" \
  nginx:alpine

上述命令表示容器最多使用 1.5 个 CPU 核心和 512MB 物理内存,且禁用 Swap。

为什么会这样

Docker 依赖 Linux 内核的 cgroups 机制实现资源隔离,若不设限容器默认可占用宿主机全部资源。当容器内存超过物理限制且未禁用 Swap 时,系统会频繁换页导致 IO 飙升;若彻底耗尽内存,内核 OOM Killer 会强制杀死进程,可能误杀宿主机关键服务。CPU 不设限则可能导致单容器占满所有核心,使其他服务响应变慢。

分步处理

第一步:评估资源水位。使用docker stats `--no-stream`查看当前容器实际占用,按峰值上浮 20% 设定限制值。

第二步:应用限制配置。单机部署优先用docker run参数;编排部署需在 docker-compose.yml 的deploy.resources.limits下写cpusmemory

第三步:确认 Swap 策略。建议将`--memory-swap`设为与`--memory`相同值,彻底禁用交换空间,避免磁盘 IO 拖垮系统。

Docker 容器内进程占用宿主机资源怎么限制?

怎么验证是否生效

运行docker stats <容器名>,观察CPU %列是否超过设定核心数比例,MEM USAGE / LIMIT列是否显示具体限制值而非宿主机总内存。也可执行docker inspect <容器名>,检查HostConfig.MemoryNanoCpus字段是否与配置一致。

常见坑

第一,docker-compose 配置不生效。资源限制必须写在deploy.resources.limits下,写在 service 根层级可能无效,且部分版本需 Swarm 模式或加`--compatibility`参数。

第二,CPU 使用率显示超 100%。top命令显示的是单核利用率百分比,若容器绑定多核,总和可能超过 100%,应以docker statsCPUs列为准。

第三,忽略 Swap 风险。只设-m不设`--memory-swap`,容器仍可使用 Swap,内存泄漏时会拖慢整个宿主机。

常见问题

设置了`--cpus` 为什么 top 里还是 100%?

因为 top 显示的是单核百分比,`--cpus` 限制的是总时间片配额,需结合 docker stats 的 CPUs 列判断。

docker-compose 里 mem_limit 为什么不生效?

因为新版 Compose 要求资源限制必须嵌套在 deploy.resources.limits 下,且部分场景需 Swarm 模式支持。

内存限制设太小会怎样?

容器进程会被内核 OOM Killer 直接杀死,容器状态变为 Exited,需查看 docker inspect 确认 OOMKilled 字段。

参考来源

  • 怎么在 Docker 中配置容器的资源限制保障宿主机系统的稳定
  • Docker | 如何限制容器的 CPU/内存/磁盘 IO 的资源利用以降低性能消耗
  • Linux 如何配置 Docker 资源限制_Linux Docker 资源限制配置技巧
  • Docker 容器资源限制实战 (从入门到精通):90% 工程师忽略的关键参数
  • 【Docker 性能优化必备】:限制资源分配的 7 种高阶用法,90% 工程师都忽略了