2016-11-04 64 views
4

我需要防止吞吐所有网络带宽的长时间运行的多TB上传,但我只能在流程级别限制其带宽使用率(这意味着减慢整个机器的网络接口或减慢此用户的网络流量)没有工作)。幸运的是,上传与Docker集成在一起。我能做些什么来减缓码头集装箱的出站流量?如何限制码头集装箱的上传速率?

回答

6

感谢this question我意识到您可以在容器中运行tc qdisc add dev eth0 root tbf rate 1mbit latency 50ms burst 10000以将其上传速度设置为1 Mb/s。

下面是一个例子Dockerfile通过产生一个随机文件,并在25KB/s的近似上传速度上传到/dev/null-as-a-service说明了这一点:

FROM ubuntu 

# install dependencies 
RUN apt-get update 
RUN apt-get install -y iproute curl 

# create a large random file to upload 
RUN head -c 2M </dev/urandom > /upload.data 

# rate-limit the network interface and 
# upload the data when docker image is run 
RUN echo "#!/bin/bash" >> /upload.sh 
RUN echo "tc qdisc add dev eth0 root tbf rate 25kbps latency 50ms burst 2500" >> /upload.sh 
RUN echo "curl -d @/upload.data http://devnull-as-a-service.com/dev/null" >> /upload.sh 
RUN chmod a+x /upload.sh 

ENTRYPOINT exec /upload.sh 

假设你有这样的Dockerfile目录内称为ratelimit这是在当前工作目录,你可以运行它:

docker build ratelimit -t ratelimit && docker run --cap-add=NET_ADMIN ratelimit 

选项​​使容器权限修改它的网络接口。你可以找到文档here

Dockerfile首先安装它所需的依赖关系。 iproute提供了tc工具,而curl允许我们提出限速要求。安装我们的依赖关系后,我们生成一个2MB的随机文件来上传。下一节将构建一个脚本文件,它将配置速率限制并开始上传。最后,我们将该脚本指定为容器运行时采取的操作。

该容器向网络接口添加令牌桶过滤器,以将连接速度降至25KB/s。提供给Token Bucker Filter的选项文档可以在here找到。

这个Dockerfile可以被修改以执行任何其他网络任务,方法是取消对cURL的调用并在其位置执行上传(当然,在安装上传需要的任何工具之后)。