最简单有效的容器写入限速手段是--device-write-bps参数。需先通过df和lsblk确认真实物理设备路径,再以docker run --device-write-bps=/dev/sda:5mb形式设置,用dd和iostat验证,并配合log-opts日志大小控制防磁盘打满。

直接用 --device-write-bps 参数限制容器对宿主机块设备的写入速率,是最简单、最有效的实战手段。关键不是“能不能限”,而是“限在哪台设备、限多少、怎么验证”。
找准宿主机真实物理设备
容器挂载的路径(比如 /data)不等于底层设备。必须查清它实际落在哪块盘上:
- 进容器执行
df -h /data,记下文件系统列(如/dev/nvme0n1p2) - 在宿主机运行
lsblk或findmnt -D /var/lib/docker,确认该设备是否对应物理盘(如/dev/sda或/dev/nvme0n1) - 避免误用虚拟设备(如
/dev/loop*)或 LVM 逻辑卷名——cgroup 限速只认真实块设备路径
启动时设置写入带宽上限
使用 --device-write-bps 指定设备路径和速率,单位支持 b/k/m/g:
-
docker run --device-write-bps=/dev/sda:5mb nginx→ 写入不超过 5 MB/s - 可叠加多个设备:
--device-write-bps=/dev/sda:3mb --device-write-bps=/dev/sdb:1mb - 读写可分开控:
--device-read-bps=/dev/sda:10mb --device-write-bps=/dev/sda:2mb,适合日志写多读少的服务
验证限速是否生效
别只看参数有没有加,要实测写入速度:
- 进容器,用
dd往挂载目录写大文件:dd if=/dev/zero of=/data/test.bin bs=4M count=100 - 观察输出中的
copied, Xs, Y MB/s—— 若稳定在设定值(如 2 MB/s),说明限制已起作用 - 同时在宿主机跑
iostat -x 1,检查对应设备的wkB/s是否被压在目标值附近
配合日志大小控制,双保险防磁盘打满
写入限速管的是 IO 压力,但日志文件无限增长会直接吃光磁盘空间。必须同步做日志截断:
- 全局配置:
/etc/docker/daemon.json加入:
{"log-driver":"json-file","log-opts":{"max-size":"100m","max-file":"3"}} - 重启 Docker:
systemctl restart docker(仅对新容器生效) - 紧急清理已有日志:
truncate -s 0 /var/lib/docker/containers/*/\*-json.log











