tc命令可在容器内直接注入延迟,需NET_ADMIN权限,支持bridge/host模式,通过qdisc add/change/del操作netem实现延迟、丢包等弱网模拟。

用 tc 命令在容器内直接注入延迟
Linux 内核的 tc(traffic control) 是 Docker 模拟弱网最底层也最可靠的方式。它工作在容器网络栈的出口(如 eth0),能精准控制延迟、丢包、乱序等行为。关键前提是容器必须具备 NET_ADMIN 权限,否则无法操作网络队列。
- 启动容器时加参数:
docker run --cap-add=NET_ADMIN -it ubuntu:22.04 - 进入容器后,执行延迟命令:
tc qdisc add dev eth0 root netem delay 300ms 50ms(基础延迟 300ms,抖动 ±50ms) - 若需叠加丢包,可追加:
tc qdisc change dev eth0 root netem delay 300ms 50ms loss 5% - 清除规则用:
tc qdisc del dev eth0 root
通过自定义 Dockerfile 构建预设弱网镜像
把网络策略固化到镜像中,适合批量测试或 CI 流程。比如构建一个默认带 200ms 延迟 + 8% 丢包的测试镜像:
- Dockerfile 中安装 iproute2(含 tc):
RUN apt-get update && apt-get install -y iproute2 - 用 ENTRYPOINT 启动时自动配置:
ENTRYPOINT ["sh", "-c", "tc qdisc add dev eth0 root netem delay 200ms loss 8%; exec \"$@\"", "_"] - 构建并运行:
docker build -t weaknet-ubuntu . && docker run --cap-add=NET_ADMIN weaknet-ubuntu sleep infinity
使用专用弱网模拟工具镜像(如 ATC 或 WANem)
Facebook 的 ATC(Augmented Traffic Control) 提供 Web 界面管理多设备弱网策略,适合团队协作测试。它本质也是基于 tc 封装,但支持按客户端 IP 动态分流。
- 拉取并运行 ATC:
docker run -d --name atc -p 8000:8000 --cap-add=NET_ADMIN --network host facebook/augmented-traffic-control - 访问
http://localhost:8000,添加 profile(如“3G”:150ms 延迟 + 2% 丢包 + 1.6Mbps 下行) - 让被测设备连接 ATC 所在宿主机的 WiFi 或代理,流量经其调度即可生效
注意容器网络模式对 tc 的影响
tc 生效位置依赖于容器使用的网络模式:
- bridge 模式(默认):eth0 是虚拟网卡,tc 对其生效,但延迟作用于容器出向流量;入向需在宿主机的 docker0 网桥上配(较复杂)
- host 模式:容器共享宿主机网络命名空间,tc 可直接操作物理网卡(如 enp0s3),控制更彻底,但隔离性下降
- none 模式:无网络栈,tc 无法使用,不适用弱网模拟


















