如何为同网络下不同分组的Docker容器设置差异化人工网络延迟
可行解决方案
方案1:单公共网络+tc基于IP地址的精准流量控制(推荐)
该方案无需配置多网卡,所有容器仅使用同一个IP对外暴露,完全解决服务IP共享的冲突问题:
- 提前创建固定网段的Docker公共网络,为4个容器分配固定IP,示例规划:Group1的C1为
172.18.0.2、C2为172.18.0.3,Group2的C3为172.18.0.4、C4为172.18.0.5。 - 在宿主机上查询该Docker网络对应的网桥名称,可执行命令
docker network inspect 你的公共网络名 | grep Bridge获取。 - 先为网桥配置默认跨组延迟规则,将所有流量默认设置为10ms延迟:
tc qdisc add dev 网桥名 root handle 1: htb default 10 tc class add dev 网桥名 parent 1: classid 1:10 htb rate 1000mbit netem delay 10ms - 再配置同组流量的低延迟规则,单独给同组互访的流量分配2ms延迟队列:
# 创建低延迟队列 tc class add dev 网桥名 parent 1: classid 1:20 htb rate 1000mbit netem delay 2ms # 配置Group1同组互访的过滤规则 tc filter add dev 网桥名 parent 1: protocol ip u32 match ip src 172.18.0.2 match ip dst 172.18.0.3 flowid 1:20 tc filter add dev 网桥名 parent 1: protocol ip u32 match ip src 172.18.0.3 match ip dst 172.18.0.2 flowid 1:20 # 同理配置Group2同组互访的过滤规则即可 - 验证时直接进入容器执行
ping命令测试,同组延迟约2ms、跨组延迟约10ms,完全符合要求。
方案2:保留原有多网卡架构+路由规则适配
如果要保留你现有双网卡的部署结构,可通过调整容器路由实现IP共享兼容:
- 所有服务统一对外宣告eth0的公共网段IP,无需修改服务配置逻辑。
- 进入每个容器配置路由/DNAT规则,当请求目标是同组容器的公共IP时,自动将流量转发到对方的eth1组内网IP,这样同组流量走eth1链路(总延迟1ms+1ms=2ms),跨组流量默认走eth0链路(总延迟5ms+5ms=10ms),满足延迟要求。
内容的提问来源于stack exchange,提问作者Aditya Sharma
相关产品推荐
相关产品推荐

