Docker通过--blkio-weight(10–1000,默认500)设置容器在竞争同一块设备时的相对IO权重,仅CFQ/BFQ调度器下生效;还可使用--blkio-weight-device为特定设备设权,或用--device-read-bps等参数实现绝对速率限制。

Docker 中没有名为 “Runtime-Constraint” 的标准机制或参数。你提到的可能是对 运行时资源约束(Runtime Resource Constraints) 的泛称,实际指的就是 Docker 通过 cgroups 实现的磁盘 I/O 控制能力。在官方文档和实践中,Docker 提供的是 --blkio-weight 和 --blkio-weight-device 这类参数来控制容器对块设备的读写“相对权重”,而非绝对速率上限。
下面直接说明如何用 Docker 原生命令实现磁盘读写权重控制:
使用 --blkio-weight 设置全局IO权重
该参数设定容器在整个块设备层级的 相对IO调度优先级,取值范围是 10–1000(默认 500),仅在多个容器竞争同一块设备时生效。
- 权重越高,获得的 IO 时间片越多(非带宽硬限)
- 不影响空闲时的 IO 能力,只在争抢时起作用
docker run -d \ --name io-high \ --blkio-weight 800 \ nginx
docker run -d \ --name io-low \ --blkio-weight 200 \ nginx
✅ 注意:宿主机内核需启用
CFQ或BFQIO 调度器(较新内核默认为none/kyber,此时blkio-weight可能不生效)。可通过cat /sys/block/*/queue/scheduler查看;如需启用,需在启动时加内核参数elevator=bfq并确保内核支持。
使用 --blkio-weight-device 绑定到具体设备设置权重
比全局权重更精细,可针对 /dev/sda、/dev/nvme0n1 等指定设备单独设权(格式:DEVICE_NAME:WEIGHT):
docker run -d \ --name io-db \ --blkio-weight-device "/dev/sdb:900" \ --blkio-weight-device "/dev/sdc:300" \ postgres
⚠️ 前提:容器必须挂载了对应设备(或宿主机上该设备真实存在且可被 cgroup 访问),否则参数会被忽略。
补充:若你需要的是“绝对速率限制”而非权重
那应使用以下参数(属于带宽/IOps 硬限,不是权重):
-
--device-read-bps /dev/sdb:50mb→ 限制每秒最大读取 50MB -
--device-write-bps /dev/sdb:20mb→ 限制每秒最大写入 20MB -
--device-read-iops /dev/sdb:1000→ 限制每秒最多 1000 次读 IO -
--device-write-iops /dev/sdb:500→ 限制每秒最多 500 次写 IO
这些才是真正意义上的“上限”,但要求宿主机有对应物理设备,且 Docker 版本 ≥ 1.10。
以上就是 Docker 中控制单容器磁盘读写权重与速率的核心方式。不复杂但容易忽略底层调度器兼容性。


















