【发布时间】:2017-03-18 16:00:08
【问题描述】:
我需要防止长时间运行的多 TB 上传占用我所有的网络带宽,但我只能将其带宽使用限制在进程级别(这意味着减慢整个机器的网络接口或减慢该用户的网络流量不会工作)。幸运的是,上传是使用 Docker 容器化的。我该怎么做才能减慢 docker 容器的出站流量?
【问题讨论】:
标签: docker upload rate-limiting
我需要防止长时间运行的多 TB 上传占用我所有的网络带宽,但我只能将其带宽使用限制在进程级别(这意味着减慢整个机器的网络接口或减慢该用户的网络流量不会工作)。幸运的是,上传是使用 Docker 容器化的。我该怎么做才能减慢 docker 容器的出站流量?
【问题讨论】:
标签: docker upload rate-limiting
感谢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
假设您在当前工作目录中名为 ratelimit 的目录中有此 Dockerfile,您可以使用以下命令运行它:
docker build ratelimit -t ratelimit && docker run --cap-add=NET_ADMIN ratelimit
--cap-add=NET_ADMIN 选项赋予容器修改其网络接口的权限。您可以找到文档here。
Dockerfile 首先安装它需要的依赖项。 iproute 提供tc 工具,curl 允许我们提出限速请求。安装我们的依赖项后,我们生成一个 2MB 的随机文件来上传。下一节将构建一个脚本文件,用于配置速率限制并开始上传。最后,我们将该脚本指定为容器运行时要执行的操作。
此容器向网络接口添加了一个令牌桶过滤器,以将连接速度减慢到 25KB/s。提供给 Token Bucker Filter 的选项的文档可以在here找到。
可以修改此 Dockerfile 以执行任何其他网络任务,方法是删除对 cURL 的调用并在其位置执行上传(当然,在安装上传所需的任何工具之后)。
【讨论】: