如何限制从 docker 容器上传的速率?

How to rate-limit upload from docker container?

我需要防止长 运行 多 TB 的上传占用我所有的网络带宽,但我只能在进程级别限制其带宽使用(这意味着减慢整个机器的网络接口或减慢该用户的网络流量是行不通的)。幸运的是,上传是用 Docker 容器化的。我该怎么做才能减慢 docker 容器的出站流量?

感谢 this question 我意识到您可以 运行 tc qdisc add dev eth0 root tbf rate 1mbit latency 50ms burst 10000 在容器中将其上传速度设置为 1 Megabit/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

选项--cap-add=NET_ADMIN 授予容器修改其网络接口的权限。您可以找到文档 here.

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

时要执行的操作

此容器向网络接口添加令牌桶过滤器以将连接速度减慢至 25KB/s。可以找到提供给令牌桶过滤器的选项的文档 here

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