温馨提示×

Ubuntu Docker如何进行容器资源限制

小樊
32
2025-12-20 10:40:30
栏目: 智能运维

Ubuntu Docker 容器资源限制实操指南

一 前置检查

  • Ubuntu 上,Docker 默认不限制容器资源。可通过 docker info 检查内核是否支持各项限制;若看到如 WARNING: No swap limit support 的提示,说明宿主机内核未启用相关 cgroup 功能,需要在宿主机层面开启后再使用内存/交换限制。内存不足时,Linux 会触发 OOM,内核会按 oom_score 选择进程终止;不建议通过 –oom-kill-disable 或极端调整 oom_score_adj 绕过,除非已设置 -m/–memory 并充分评估风险。

二 内存限制

  • 常用参数与含义
    • -m/–memory:硬上限,最小 4MB
    • –memory-swap:总内存+交换上限;仅在设置了 -m 后才有意义。
    • –memory-reservation:软限制,低于硬限制,发生内存争用时触发回收。
    • –memory-swappiness:容器匿名页换出倾向,0–100
    • –kernel-memory:内核内存上限,最小 4MB,不可换出,超限可能阻塞主机。
    • –oom-kill-disable:仅在设置了 -m 时可用,禁止 OOM Killer 杀容器内进程(慎用)。
  • 典型用法
    • 仅限制物理内存为 512MBdocker run -it -m 512m ubuntu
    • 限制内存 300MB 且禁用交换:docker run -it -m 300M --memory-swap -1 ubuntu
    • 限制内存 300MB 且总内存+交换为 1GB(即 700MB 交换):docker run -it -m 300M --memory-swap 1G ubuntu
    • 软限制示例:硬限制 500MB、软限制 200MBdocker run -it -m 500M --memory-reservation 200M ubuntu
  • 验证要点
    • 运行后可在 cgroup 查看:cat /sys/fs/cgroup/memory/docker/<容器ID>/memory.limit_in_bytes(硬限制)、memory.soft_limit_in_bytes(软限制)。

三 CPU 限制

  • 常用参数与含义
    • -c/–cpu-shares:相对权重,默认 1024,仅在 CPU 竞争时生效。
    • –cpus:限制可使用的 CPU 核数(浮点),如 0.52
    • –cpu-period/–cpu-quota:CFS 周期与配额(单位 μs),周期默认 100000μs(100ms);配额/周期≈可占用的 CPU 比例。
    • –cpuset-cpus:将容器绑定到指定 CPU 核心,如 “0,2-3”
  • 典型用法
    • 限制最多使用 0.5 个 CPU:docker run -it --cpus=0.5 ubuntu
    • 等价写法:每 50ms 周期允许运行 25ms(约 50% CPU):docker run -it --cpu-period=50000 --cpu-quota=25000 ubuntu
    • 绑定到 CPU 0 与 3docker run -it --cpuset-cpus="0,3" ubuntu
  • 验证要点
    • 观察容器 CPU 使用:docker stats
    • 查看 cgroup:cat /sys/fs/cgroup/cpu/docker/<容器ID>/cpu.sharescpu.cfs_quota_uscpu.cfs_period_us

四 块 I/O 限制

  • 常用参数与含义
    • –blkio-weight:块 I/O 权重,默认 500,相对比例。
    • –device-read-bps/–device-write-bps:按设备限制每秒字节数(B/s)。
    • –device-read-iops/–device-write-iops:按设备限制每秒 I/O 次数。
  • 典型用法
    • 降低某容器的磁盘优先级:docker run -it --blkio-weight 300 ubuntu
    • 限制对 /dev/sda 的读取速率为 1MB/sdocker run -it --device-read-bps /dev/sda:1mb ubuntu
    • 限制对 /dev/sda 的写入速率为 10MB/sdocker run -it --device-write-bps /dev/sda:10mb ubuntu
    • 限制读取 IOPS=1000docker run -it --device-read-iops /dev/sda:1000 ubuntu
  • 说明
    • 速率单位可用 kb/kib/mb/mib/gb/gib;需确保对目标设备有访问权限(必要时通过 –device 显式授予)。

五 运行与编排实践

  • 动态更新运行中容器的部分资源(如内存、CPU 份额):docker update -m 1G --cpu-shares=2048 <容器名或ID>;并非所有参数都支持热更新,内存与 CPU 份额通常可用。
  • 使用 Docker Compose(示例)
    • 版本 3.8+ 的编排文件可按服务设置 limits/reservations
      version: "3.8"
      services:
        app:
          image: ubuntu:22.04
          command: sleep infinity
          deploy:
            resources:
              limits:
                cpus: "1.0"
                memory: 512M
              reservations:
                cpus: "0.5"
                memory: 256M
      
    • 注意:Compose 的 deploy.resources 主要用于 Swarm 模式;在 docker-compose up 场景需确保引擎支持并启用相应特性。
  • 网络带宽限制(不在 Docker 原生参数内)
    • 可在容器内用 tc 限速(示例将 eth0 限速为 1Mbit/s):
      docker exec -it <容器ID> sh -c "tc qdisc add dev eth0 root tbf rate 1mbit burst 32kbit latency 400ms"
      
    • 清理:tc qdisc del dev eth0 root

0