首页主机资讯Docker容器在Ubuntu中的资源限制

Docker容器在Ubuntu中的资源限制

时间2026-01-18 08:16:03发布访客分类主机资讯浏览1458
导读:Docker 容器在 Ubuntu 中的资源限制 一 核心维度与常用参数 CPU 上限核数:使用 –cpus 指定最大可用 CPU 核数(支持小数,如 0.5、1.5)。 相对权重:使用 –cpu-shares(默认 1024),仅在...

Docker 容器在 Ubuntu 中的资源限制

一 核心维度与常用参数

  • CPU
    • 上限核数:使用 –cpus 指定最大可用 CPU 核数(支持小数,如 0.51.5)。
    • 相对权重:使用 –cpu-shares(默认 1024),仅在 CPU 紧张时生效,用于相对份额分配。
    • 精确配额:使用 –cpu-period–cpu-quota(单位微秒)。例如 –cpu-period=100000 --cpu-quota=50000 表示每 100ms 最多使用 50ms(约 50% CPU)。
    • 核心绑定:使用 –cpuset-cpus 将容器进程绑定到指定核心(如 “0,1”“0-3”)。
  • 内存
    • 硬上限:使用 -m/–memory(如 512m1g)。超过会触发 OOM Killer(除非配置了交换)。
    • 内存+交换:使用 –memory-swap 设置“内存+交换”的总上限;设为 -1 表示交换不限制;若仅设置 -m 而未设置 –memory-swap,常见行为是总上限为内存的两倍(以 Docker 默认实现为准)。
    • 软预留:使用 –memory-reservation 设置内存软限制,用于内存争用时的回收引导。
    • 内核内存:使用 –kernel-memory 限制内核态内存(如 slab、sockets),不可换出,通常与 -m 配合使用且不能超过 -m
  • 磁盘 I/O
    • 带宽限制:使用 –device-read-bps–device-write-bps(单位如 1mb)。
    • IOPS 限制:使用 –device-read-iops–device-write-iops(如 1000)。
    • 权重控制:使用 –blkio-weight(相对权重,默认 500)。

二 快速上手示例

  • 限制 CPU 与内存
    • 仅使用 1 个 CPU 核心,内存上限 512MB
      docker run -d --name app --cpus=1 -m 512m ubuntu:24.04 sleep 3600
      
    • 限制为 0.5 个 CPU 核心,内存上限 1GB,并禁用交换(内存+交换=1GB):
      docker run -d --name app --cpus=0.5 -m 1g --memory-swap=1g ubuntu:24.04 sleep 3600
      
  • 绑定 CPU 核心并限制磁盘写入带宽
    • 绑定到核心 0-1,对 /dev/sda 写入限速 1MB/s
      docker run -d --name app \
        --cpuset-cpus="0-1" \
        --device-write-bps=/dev/sda:1mb \
        ubuntu:24.04 sleep 3600
      
  • 查看与监控
    • 实时资源使用:
      docker stats app
      
    • 查看容器详细配置(如 Memory、NanoCpus 等):
      docker inspect app | grep -A5 -B5 '"HostConfig"'
      

三 进阶与运维实践

  • 动态修改运行中容器
    • 调整内存与 CPU 权重(无需重启):
      docker update -m 1g --cpu-shares=2048 app
      
  • 为所有容器设置默认资源或系统参数
    • 编辑 /etc/docker/daemon.json(修改后需重启 Docker):
      {
      
        "default-ulimits": {
      
          "nofile": {
       "Name": "nofile", "Hard": 65536, "Soft": 65536 }
      
        }
      ,
        "exec-opts": ["native.cgroupdriver=systemd"]
      }
          
      sudo systemctl restart docker
      
  • 网络带宽限制
    • Docker 本身不直接提供带宽限制,可结合 tc 与命名空间实现。例如限制容器 < container_id> 出方向 10Mbps
      pid=$(docker inspect -f '{
      {
      .State.Pid}
      }
          ' <
          container_id>
          )
      nsenter -t $pid -n tc qdisc add dev eth0 root tbf rate 10mbit latency 50ms burst 1540
      
  • 生产建议
    • 为关键容器同时设置 –cpus-m,并将 –memory–memory-swap 设为相同值以减少 swap 滥用。
    • 使用 docker stats 持续观测,必要时配合 cAdvisor/Prometheus 做告警与容量规划。

四 常见误区与排查

  • –cpu-shares 不是硬性上限,仅在 CPU 竞争时按权重分配;需要硬上限请用 –cpus–cpu-period/–cpu-quota
  • –memory-swap 的语义容易混淆:未设置时常见为“内存上限的两倍”;若希望禁用交换,请显式设为 –memory-swap=-1;若希望“内存+交换=内存上限”,请将两者设为相同值(如 -m 1g --memory-swap=1g)。
  • 使用 –device-read/write-bps/iops 需明确指定块设备(如 /dev/sda),且容器需对该设备有访问权限。
  • 调整已运行容器的资源时,优先使用 docker update;部分参数变更可能仍需重启容器,变更前建议在测试环境验证。

声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


若转载请注明出处: Docker容器在Ubuntu中的资源限制
本文地址: https://pptw.com/jishu/784006.html
ubuntu selinux如何管理端口 如何通过Debian readdir实现文件压缩

游客 回复需填写必要信息