Docker通过--device-read-bps和--device-write-bps参数基于cgroup blkio子系统,对容器访问宿主机真实块设备(如/dev/sda)的读写带宽进行硬性节流,单位支持b/k/m/g(大小写敏感),可独立配置读写速率或改用--device-read-iops/--device-write-iops限制IOPS,但二者不可对同一设备共存。

在 Docker 中限制单个容器的 IO 读写速度,核心是使用 --device-read-bps 和 --device-write-bps 这两个运行时参数,它们基于 Linux 内核的 cgroup blkio 子系统,对容器访问宿主机块设备的带宽进行硬性节流。
指定真实块设备路径并设置速率上限
这两个参数必须指向宿主机上的物理块设备(如 /dev/sda、/dev/nvme0n1),不能是挂载点或虚拟文件系统路径。单位支持 b、k、m、g(大小写敏感,m 表示 MB,非 MiB):
-
--device-write-bps=/dev/sda:2m:限制该容器向/dev/sda每秒最多写入 2 MB -
--device-read-bps=/dev/sda:5m:限制该容器从/dev/sda每秒最多读取 5 MB - 可同时为多个设备设限,例如:
--device-write-bps=/dev/sda:1m --device-write-bps=/dev/sdb:500k
区分读写限速与 IOPS 限速
当业务以随机小文件操作为主(如数据库),更推荐用 IOPS 限速,它更贴合底层设备的实际响应能力:
-
--device-read-iops=/dev/sda:800:限制每秒最多 800 次读 I/O 请求 -
--device-write-iops=/dev/sda:400:限制每秒最多 400 次写 I/O 请求 - bps 和 iops 参数不可对同一设备同时设置,否则 iops 会被静默忽略
验证设备存在与权限是否满足
容器要成功应用限速,需满足两个前提:
- 宿主机上设备路径真实存在,可用
lsblk或df -h确认(例如/var/lib/docker所在分区对应哪个/dev/xxx) - 容器默认有访问设备的权限;若报错“permission denied”,需加
--device /dev/sda:/dev/sda:rwm显式挂载设备 - 注意:overlay2 存储驱动本身不支持直接限速,限速只作用于底层块设备
验证限速是否生效
docker stats 不显示节流状态,需实测验证:
- 进容器执行绕过缓存的写测试:
dd if=/dev/zero of=/tmp/test bs=4k count=10000 oflag=direct - 对比加限前后耗时,或观察输出末尾的速率(如
2MB/s) - 查内核统计:
cat /sys/fs/cgroup/blkio/docker/<container-id>/blkio.throttle.io_service_bytes,若出现Throttled类型计数增长,说明限速已触发


















