如何限制从docker集装箱上传速度?

我需要防止长时间运行的多TB上传消耗我所有的networking带宽,但是我只能在stream程级别上限制其带宽使用(这意味着减慢整个机器的networking接口或者减慢这个用户的networkingstream量工作)。 幸运的是,上传与Docker集装箱化。 我能做些什么来减缓docker集装箱的出站stream量?

感谢这个问题,我意识到你可以在容器中运行tc qdisc add dev eth0 root tbf rate 1mbit latency 50ms burst 10000来将其上传速度设置为1兆比特/秒。

下面是一个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 

假设您在当前工作目录中的名为ratelimit的目录中包含此Dockerfile,则可以使用以下命令运行它:

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

选项--cap-add=NET_ADMIN赋予容器修改其networking接口的权限。 你可以在这里find文档。

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

这个容器在networking接口上增加了一个令牌桶filter(Token Bucket Filter)来减慢连接速度到25KB / s。 提供给Token Bucker Filter的选项的文档可以在这里find。

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