Linux下限制Docker容器网络带宽需借助cgroups与tc工具,主要方式包括:1. --network=none配合手动tc限速;2. 自定义bridge网络+tc;3. wondershaper等第三方工具;4. CNI插件(如bandwidth)用于K8s环境。

在 Linux 下限制 Docker 容器网络带宽,核心是借助 cgroups v1/v2 和 tc(traffic control) 配合 Docker 的网络驱动或手动配置实现。Docker 原生不直接提供细粒度带宽限速(如 per-container 的 ingress/egress 速率),但可通过以下几种成熟、稳定的方式达成目标。
使用 --network=none + 手动 tc 限速(最灵活可靠)
适用于需要精确控制入向(ingress)和出向(egress)带宽的场景,尤其适合生产环境定制化部署。
- 启动容器时禁用默认网络:
docker run --network=none ... - 手动创建 network namespace 并绑定 veth 对,将容器接入自定义网络栈
- 在宿主机端的 veth 接口上用
tc设置 qdisc(如htb或tbf)进行限速
例如限制出向带宽为 5Mbps:tc qdisc add dev vethabc123 root tbf rate 5mbit burst 32kbit latency 400ms - 入向限速需借助
ifb模块(需先加载:modprobe ifb && ip link set dev ifb0 up),再重定向 ingress 流量到 ifb 设备处理
使用 Docker 20.10+ 内置的 --ulimit 和 --cpus 不适用,但可配合 --network=bridge + 自定义桥接+tc
Docker 默认 bridge 网络(如 docker0)下的容器共享一个网桥,无法直接对单个容器限速。但你可以:
- 创建自定义 bridge 网络:
docker network create --driver bridge --subnet=172.20.0.0/24 mynet - 启动容器时指定该网络:
docker run --network=mynet ... - 查出容器对应宿主机侧的 veth 接口名(
ip link show | grep veth或docker inspect CONTAINER_ID | grep -A 10 "NetworkSettings" | grep "veth") - 对该 veth 接口执行 tc 限速(同上),效果等同于容器级限速
使用第三方工具:wondershaper 或 docker-limit
适合快速验证或开发测试环境,降低 tc 使用门槛。
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
-
wondershaper 是轻量级 tc 封装脚本,支持一键限速:
sudo wondershaper vethabc123 2048 1024(下行2MB/s,上行1MB/s) - docker-limit(GitHub 开源项目)可自动绑定容器生命周期,监听容器启停并动态增删 tc 规则,支持 YAML 配置带宽策略
- 注意:这些工具仍依赖底层 tc,需确保内核支持且权限足够(root)
使用 CNI 插件(如 bandwidth CNI)配合 Kubernetes 或高级编排
若运行在 Kubernetes 环境中,推荐使用标准 CNI 插件实现声明式限速:
- 启用 bandwidth CNI 插件
- 在 CNI 配置中为 Pod 添加带宽字段:
"bandwidth": {"ingressRate": 10000000, "ingressBurst": 1000000}(单位 bit/s) - Docker 本身不原生集成 CNI,但在 containerd + CNI 场景下(如 KinD、Podman、K8s)更规范、可扩展性强
实际选择取决于你的运行环境和运维能力:简单测试可用 wondershaper;生产级稳定控制建议手写 tc 脚本 + systemd service 管理;大规模集群优先走 CNI 标准方案。所有方式均需 root 权限,且限速生效对象是容器的网络接口,而非进程或端口。










