我想为点对点应用程序设置一个 Docker 容器。该应用程序没有应用程序级别的速率限制,因此我试图在容器级别上设置限制。我希望对所有端口的出站和入站连接进行速率限制,但不包括该应用程序 Web UI 使用的端口。
我发现限制Docker容器的网络带宽(入站和出站)的最佳方法是在运行容器内部使用Linux自己的流量控制设置。在启动P2P应用程序之前,在容器内执行tc
命令。
例如,您可以创建以下启动脚本,将其复制到docker映像中,并将其作为ENTRYPOINT调用。
Dockerfile(片段):
COPY start-my-p2p.sh /
RUN chmod +x /start-my-p2p.sh
ENTRYPOINT /start-my-p2p.sh
在您的 start-my-p2p.sh 文件中添加类似以下内容(tc
命令可能是您一直在互联网上搜索的内容):
将类似以下内容放入您的 start-my-p2p.sh 中(tc
命令可能是您一直在搜索互联网上的内容):
#/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
重要提示:在启动容器时,您需要使用--cap-add=NET_ADMIN
参数:
docker run --rm -it --cap-add=NET_ADMIN -p6969:p6969 myimage
# find container pid
container_id=$(docker inspect some_container -f '{{.State.Pid}}')
mkdir -p /var/run/netns
# link network namespace for `some_container`
ln -sfT /proc/$container_id/ns/net /var/run/netns/some_container
# view the interface of the container
ip netns exec some_container ip -br -c link
# add traffic control policy to the interface in network namespace `some_container`
# tc -n some_container qdisc add dev eth0 tbf rate 1024kbps 1024b limit 1024b
# update tc 2023/05/19
tc -n some_container qdisc add dev eth0 handle 10: root tbf limit 1024 burst 2048 rate 1024
tc -n
命令给出了 RTNETLINK answers: No such file or directory
的错误信息。eth0
是主机还是容器的接口? - undefinedtc -n
命令可以在网络命名空间上运行 tc。
可以通过 ip netns ls
命令来检查网络命名空间。 - undefined