Docker容器在Ubuntu中的资源限制
导读:Docker 容器在 Ubuntu 中的资源限制 一 核心维度与常用参数 CPU 上限核数:使用 –cpus 指定最大可用 CPU 核数(支持小数,如 0.5、1.5)。 相对权重:使用 –cpu-shares(默认 1024),仅在...
Docker 容器在 Ubuntu 中的资源限制
一 核心维度与常用参数
- CPU
- 上限核数:使用 –cpus 指定最大可用 CPU 核数(支持小数,如 0.5、1.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(如 512m、1g)。超过会触发 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
- 仅使用 1 个 CPU 核心,内存上限 512MB:
- 绑定 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
- 绑定到核心 0-1,对 /dev/sda 写入限速 1MB/s:
- 查看与监控
- 实时资源使用:
docker stats app - 查看容器详细配置(如 Memory、NanoCpus 等):
docker inspect app | grep -A5 -B5 '"HostConfig"'
- 实时资源使用:
三 进阶与运维实践
- 动态修改运行中容器
- 调整内存与 CPU 权重(无需重启):
docker update -m 1g --cpu-shares=2048 app
- 调整内存与 CPU 权重(无需重启):
- 为所有容器设置默认资源或系统参数
- 编辑 /etc/docker/daemon.json(修改后需重启 Docker):
{ "default-ulimits": { "nofile": { "Name": "nofile", "Hard": 65536, "Soft": 65536 } } , "exec-opts": ["native.cgroupdriver=systemd"] } sudo systemctl restart docker
- 编辑 /etc/docker/daemon.json(修改后需重启 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
- Docker 本身不直接提供带宽限制,可结合 tc 与命名空间实现。例如限制容器 <
container_id>
出方向 10Mbps:
- 生产建议
- 为关键容器同时设置 –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
