2016-11-04 31 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的調用並在其位置執行上傳(當然,在安裝上傳需要的任何工具之後)。