在Docker中模拟网络延迟需用tc工具在容器内配置netem规则,先创建隔离bridge网络,运行带NET_ADMIN权限的容器,再通过docker exec执行tc qdisc add dev eth0 root netem delay 300ms 20ms注入延迟,最后用ping验证并用tc qdisc del清除。

在 Docker 中模拟容器网络请求延迟,核心是利用 Linux 的 tc(traffic control)工具,在容器网络接口上注入延迟规则。这不是靠 Docker 原生命令配置,而是通过 docker exec 进入容器后调用内核网络控制能力实现的。整个过程轻量、可复现,适合混沌工程和弱网测试。
创建隔离测试网络
避免干扰宿主机或其他容器,先建一个专用 bridge 网络:
docker network create --driver bridge --subnet 172.20.0.0/24 delayed-net- 子网可自定义,确保不与现有网络冲突
- 后续所有参与测试的容器都应加入该网络
启动待测容器并确认网络就绪
以最小镜像为例(如 alpine 或 busybox),运行两个互通容器:
docker run -d --name client --network delayed-net alpine tail -f /dev/null-
docker run -d --name server --network delayed-net alpine httpd -f -h /tmp && echo "OK"(或用nc -l -p 8080简单监听) - 验证基础连通:
docker exec client ping -c 3 server,应返回毫秒级响应
注入延迟:使用 tc netem 规则
延迟必须作用于容器内部的出站流量路径(通常是 eth0)。注意:容器需具备 NET_ADMIN 权限才能执行 tc:
- 重启容器时加权限:
docker run --cap-add=NET_ADMIN ... - 或对已运行容器临时提权(不推荐生产):
docker update --cap-add=NET_ADMIN client - 添加 300ms 延迟(正态分布 ±20ms):
docker exec client tc qdisc add dev eth0 root netem delay 300ms 20ms - 若要模拟抖动,可加
distribution normal;丢包加loss 5%
验证与清理
延迟生效后立即验证效果,并记得及时清除规则避免影响后续测试:
- 验证:
docker exec client ping -c 4 server,观察 avg 时间是否接近 300ms - 清除规则:
docker exec client tc qdisc del dev eth0 root - 查看当前规则:
docker exec client tc qdisc show dev eth0











