Docker 限制容器 CPU 和内存资源怎么设置 limits

文章导读
Docker 限制容器 CPU 和内存资源主要通过 docker run 命令添加 `--memory` 和 `--cpus` 参数实现,适用于生产环境防止单个容器耗尽宿主机资源。设置过低会导致容器被 OOM Kill 或 CPU 节流,设置前需确认宿主机内核支持 cgroups 资源统计。
📋 目录
  1. A 命令速用版
  2. B 为什么会这样
  3. C 分步处理
  4. D 怎么验证是否生效
  5. E 常见坑
  6. F 常见问题
  7. G 参考来源
A A

Docker 限制容器 CPU 和内存资源主要通过 docker run 命令添加 `--memory``--cpus` 参数实现,适用于生产环境防止单个容器耗尽宿主机资源。设置过低会导致容器被 OOM Kill 或 CPU 节流,设置前需确认宿主机内核支持 cgroups 资源统计。

先说结论:通过启动参数或 update 命令设置硬限制,能有效隔离资源风险,但需预留少量缓冲避免频繁重启。

  • 适合:多租户环境、批处理任务、防止异常进程拖垮宿主机
  • 先准备:确认内核 cgroups 开启、评估应用基线资源消耗
  • 验收:使用 docker stats 观察实际使用率、检查 dmesg 是否有 OOM 记录

命令速用版

启动容器时直接添加参数,语法格式为 `--memory`=<值>`--cpus`=<值>

docker run -d `--name` my-app \
  `--memory`="512m" \
  `--memory-swap`="512m" \
  `--cpus`="1.5" \
  nginx:latest

对运行中的容器调整限制,使用 docker update 命令。

docker update `--memory`="1g" `--cpus`="2" my-app

为什么会这样

Docker 资源限制底层依赖 Linux 内核的 cgroups 功能,内核强制进程组不能超过设定的阈值。

当容器内存超过 `--memory` 设定值时,内核 OOM Killer 会终止容器内进程;当 CPU 超过 `--cpus` 设定值时,内核调度器会限制该容器的 CPU 时间片,表现为计算变慢而非直接报错。

分步处理

步骤 1:检查宿主机支持情况

执行 docker info,确认输出中包含 Memory LimitCPU CFS 相关支持信息。如果显示警告,说明内核未开启对应 cgroups 功能。

Docker 限制容器 CPU 和内存资源怎么设置 limits

步骤 2:设置启动限制

docker rundocker-compose.yml 中定义资源。Compose 文件中使用 deploy.resources.limits 字段。

步骤 3:处理运行中容器

若容器已运行,无需重建,直接使用 docker update 生效。注意部分旧版本 Docker 可能不支持在线调整所有参数。

怎么验证是否生效

使用 docker stats 实时查看容器资源使用百分比和绝对值,观察是否接近设定上限。

使用 docker inspect <容器 ID> 查看 HostConfig.MemoryHostConfig.NanoCpus 字段确认配置值。

Docker 限制容器 CPU 和内存资源怎么设置 limits

检查宿主机 dmesg -T | grep -i "out of memory",确认是否有因限制导致的杀进程记录。

常见坑

Swap 默认行为:默认情况下 `--memory-swap` 等于 `--memory` 的两倍,若不想使用 swap,需将两者设为相同值。

Java 应用识别:旧版本 JDK 可能无法识别容器内存限制,导致堆内存设置超过容器限制而触发 OOM,需添加 -XX:+UseContainerSupport 参数。

CPU 单位混淆:`--cpus` 支持小数(如 1.5),而 `--cpu-quota` 需要配合 `--cpu-period` 计算微秒数,建议优先使用 `--cpus`

常见问题

容器超过内存限制会发生什么?

容器内进程会被 Linux 内核 OOM Killer 强制终止,容器状态变为 Exited,退出码通常为 137。

能否限制 running 状态的容器资源?

可以,使用 docker update 命令修改运行中容器的 CPU 和内存限制,无需重启容器。

cpu-shares 和 cpus 有什么区别?

`--cpus` 是硬限制,不能超过设定值;`--cpu-shares` 是权重,仅在 CPU 竞争时按比例分配,空闲时可占用更多。

参考来源

  • Docker 官方文档,Configure the cgroup driver,https://docs.docker.com/config/containers/runmetrics/
  • Docker 官方文档,Resource constraints,https://docs.docker.com/config/containers/resource_constraints/