温馨提示×

Docker在Linux中的资源限制怎么设置

小樊
31
2026-01-02 20:24:43
栏目: 智能运维

Docker 在 Linux 中的资源限制设置

一 核心概念与前置检查

  • Docker 的资源限制基于 Linux cgroups,可对 CPU、内存、磁盘 I/O 等进行配额与隔离;默认容器不限制,可能互相影响甚至拖垮宿主机。
  • 运行 docker info 若出现 WARNING: No swap limit support,说明内核未开启内存与 swap 记账,需要在宿主机启用后再设置内存/swap 限制(见下文“内存与 swap 限制”的启用步骤)。

二 CPU 限制

  • 常用参数与含义
    • –cpu-shares/-c:相对权重,默认 1024;仅在 CPU 竞争时生效,空闲时不限。示例:-c 512-c 1024 在争用时约为 1:2
    • –cpus:限制可使用的 CPU 核数,支持小数,如 1.5 表示最多使用 150% 的一个 CPU 时间片配额。
    • –cpuset-cpus:将容器绑定到指定核心,如 “0,3”“0-2”
    • –cpu-period / --cpu-quota:CFS 调度周期与配额(单位 微秒)。周期默认 100000us(100ms),配额 -1 表示不限制;例如 --cpu-period=50000 --cpu-quota=25000 约等于 50% CPU。
  • 示例
    • 绑定核心并限制为 2 核:docker run -it --rm --cpuset-cpus="0,3" --cpus=2 ubuntu:24.04 bash
    • 使用 CFS 配额精确控制:docker run -it --rm --cpu-period=100000 --cpu-quota=75000 ubuntu:24.04 bash(约 75% CPU)

三 内存与 swap 限制

  • 常用参数
    • -m/–memory:硬性内存上限,单位 b/k/m/g,最小 4M
    • –memory-swap:内存+swap 的总上限;规则:
      • 仅设置 -m=1G(不设置 --memory-swap):可用 内存 1G + swap 1G(等同设置 --memory-swap=2G)。
      • 设置 -m=1G --memory-swap=3G:可用 内存 1G + swap 2G
      • 设置 -m=1G --memory-swap=-1:内存 1G,swap 不限制(受宿主机 swap 总量约束)。
    • –memory-reservation:软性预留,资源紧张时促回收,不强制。
    • –oom-kill-disable / --oom-score-adj:OOM 行为控制;启用 --oom-kill-disable 前务必设置 -m,避免系统无约束被杀。
    • –memory-swappiness:容器内的 swappiness 取值 0–100
    • –kernel-memory:核心内存上限(不可换出),如 -m 500M --kernel-memory 50M
  • 启用内存/swap 记账(若 docker info 提示不支持)
    • 编辑 /etc/default/grub,在 GRUB_CMDLINE_LINUX 末尾追加:cgroup_enable=memory swapaccount=1
    • 更新 GRUB 并重启(如 update-grub 或发行版对应命令)
  • 示例
    • 仅限内存 512MB,禁用 swap:docker run -it --rm -m 512M --memory-swap=512M ubuntu:24.04 bash
    • 限内存 1G,允许使用宿主机全部 swap:docker run -it --rm -m 1G --memory-swap=-1 ubuntu:24.04 bash

四 磁盘 I/O 限制

  • 常用参数
    • –blkio-weight:块 I/O 权重,默认 500,相对优先级。
    • –device-read/write-bps:限制对指定设备的读写带宽(单位如 MB/s)。
    • –device-read/write-iops:限制每秒 I/O 次数。
    • 注意:块 I/O 限速对 direct I/O 有效,测试时常用 oflag=direct
  • 示例
    • 限制向宿主机 /dev/sda 写速率为 30MB/s
      • docker run -it --rm --device-write-bps /dev/sda:30MB ubuntu:24.04 dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct

五 验证与编排示例

  • 运行时验证
    • 实时查看:docker stats <容器名/ID>
    • 进入容器查看 cgroup 配额:
      • CPU 配额核数:expr $(cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us) / $(cat /sys/fs/cgroup/cpu/cpu.cfs_period_us)
      • 内存上限(字节):cat /sys/fs/cgroup/memory/memory.limit_in_bytes
  • Docker Compose 示例(version 3.7+)
    • 仅设置 limits(Swarm/Compose 模式生效):
      version: "3.7"
      services:
        app:
          image: nginx:1.25
          deploy:
            resources:
              limits:
                cpus: "0.5"
                memory: 512M
      
    • 如需同时设置“保留”(reservations),可在同层级增加 reservations: 字段(部分环境/模式支持)。

0