如何对 docker 容器上的网络流量进行速率限制

Mye*_*ter 7 rate-limiting docker

我想为对等 2 对等应用程序设置一个 docker 容器。此应用程序没有应用程序级别的速率限制,因此我尝试在容器级别设置限制。我想对所有端口上的传出和传入连接进行速率限制,但应用程序的 Web UI 使用的端口除外。

mat*_*son 10

我很惊讶找到这个问题的答案是多么困难。各种论坛上的大多数答案都不正确(我用两个 iperf3 节点对它们进行了测试,发现这些解决方案不起作用或仅限制了一个流量方向(仅传入或仅传出)。具有更多对称数据使用的 P2P 应用程序与传统的客户端/服务器应用程序相比,因此必须限制双向流量。

我发现的最好的方法是限制 Docker 容器的网络带宽(传入和传出)是在运行的容器中使用 Linux 自己的流量控制设置。启动 P2P 应用程序之前执行tc容器内的命令。

例如,您可以创建如下所示的启动脚本,将其复制到您的 docker 映像中并将其作为 ENTRYPOINT 调用。

Dockerfile(片段):

COPY start-my-p2p.sh /
RUN chmod +x /start-my-p2p.sh    
ENTRYPOINT /start-my-p2p.sh   
Run Code Online (Sandbox Code Playgroud)

在 start-my-p2p.sh 中放入类似的内容(命令行tc可能是您在 Internet 上搜索的内容):

#/bin/sh

# Limit all incoming and outgoing network to 1mbit/s
tc qdisc add dev eth0 handle 1: ingress
tc filter add dev eth0 parent 1: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate 1mbit burst 10k drop flowid :1
tc qdisc add dev eth0 root tbf rate 1mbit latency 25ms burst 10k`

# Now start your p2p application
myp2pservice -d 
Run Code Online (Sandbox Code Playgroud)

重要提示:启动容器时,您需要使用--cap-add=NET_ADMIN

docker run --rm -it --cap-add=NET_ADMIN -p6969:p6969 myimage
Run Code Online (Sandbox Code Playgroud)