我需要防止长时间运行的数兆字节的上传占用我网络的所有带宽,但是我只能在进程级别上限制其带宽使用(这意味着减慢整个计算机的网络接口(interface)或减慢该用户的网络流量不会工作)。幸运的是,上传是使用Docker容器化的。我该怎么做才能减慢Docker容器的出站流量?
最佳答案
多亏了this question,我意识到您可以在容器中运行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
假设此Dockerfile位于当前工作目录中名为
ratelimit
的目录中,则可以使用以下命令运行它:docker build ratelimit -t ratelimit && docker run --cap-add=NET_ADMIN ratelimit
选项
--cap-add=NET_ADMIN
授予容器修改其网络接口(interface)的权限。您可以找到文档here。Dockerfile首先安装它需要的依赖项。
iproute
提供了tc
工具,而curl
则允许我们提出限速请求。安装依赖项后,我们将生成一个2MB的随机文件进行上传。下一节将构建一个脚本文件,该文件将配置速率限制并开始上传。最后,我们指定该脚本作为运行容器时要执行的操作。该容器将 token 桶过滤器添加到网络接口(interface),以将连接速度降低到25KB / s。可以在here中找到 token 桶过滤器提供的选项的文档。
可以将该Dockerfile修改为执行任何其他网络任务,方法是删除对cURL的调用并在其位置执行上载(当然,在安装了上载所需的任何工具之后)。
关于docker - 如何对从Docker容器上传的文件进行速率限制?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40429098/