Docker容器限速需在宿主机用tc对veth接口操作:先通过docker inspect和ip命令定位veth设备,再用tc qdisc添加tbf或htb规则限制出向带宽,最后用tc qdisc show验证;规则需root权限且不随容器销毁自动清除。

在 Docker 中配置容器的网络吞吐量限制(即限流),本质是控制其出向(egress)带宽,Docker 原生命令不支持直接限速,必须借助 Linux 内核的 tc(Traffic Control)工具,在宿主机侧对容器对应的虚拟网卡(veth)进行操作。核心思路清晰:定位 → 限速 → 验证,无需进容器、不依赖额外镜像。
准确定位容器的 veth 接口
每个桥接网络(如默认 `docker0`)下的容器,在宿主机上都有一对 veth 设备,其中一端挂在 `docker0` 上,就是你要操作的目标接口: - 查容器 IP 和 MAC 地址:`docker inspect myapp | grep -A 5 "IPAddress\|MacAddress"` - 根据 MAC 查 veth 名称:`ip -br link show | grep -B1 'aa:bb:cc:dd:ee:ff' | head -1 | awk '{print $1}'`(替换为实际 MAC) - 确认该接口存在且活跃:`ip link show vethabcd12`用 tc 在宿主机侧对 veth 主机端限速
限速必须作用于 veth 的**宿主机端**(如 `vethabcd12`),且只对容器发出的流量(容器 → 外部)生效,这是最稳定、最常用的方式: - 限制总出口带宽为 2 Mbps(简单可靠):`tc qdisc add dev vethabcd12 root tbf rate 2mbit burst 32kbit latency 400ms` - 若需更灵活的分层控制(如保底 + 弹性借用),用 HTB:`tc qdisc add dev vethabcd12 root handle 1: htb default 30`,再添加 class 和 filter - 清除已有规则(修改前必做):`tc qdisc del dev vethabcd12 root`验证与注意事项
- 规则生效后,可用 `tc qdisc show dev vethabcd12` 查看当前限速配置 - 限速仅影响容器发往外部的流量;若需双向控制,需在容器内对 `eth0` 操作,但要求启动时加 `--cap-add=NET_ADMIN`,且容器内安装 `iproute2` - 所有 `tc` 操作需 root 权限,且规则不会随容器销毁自动清理,建议写成脚本配合 `docker events` 或使用 `wondershaper` 封装简化替代方案与生产建议
- 单机轻量场景:用 `wondershaper vethabcd12 2048 1024`(下行/上行 KB/s),命令更简 - Kubernetes 环境:优先通过 CNI 插件实现,如 Cilium(eBPF)、Calico(tc),声明式配置更可靠 - 避免在 `--network=host` 模式下尝试——此时容器共享宿主机网络栈,无法按容器粒度限速不复杂但容易忽略


















