2016-11-04 13 views
4

長時間稼働しているマルチテラバイトのアップロードが私のネットワークの帯域幅をすべて奪わないようにする必要がありますが、帯域幅の使用量をプロセスレベルで制限することができます(マシンのネットワークインターフェイス全体を遅くしたり、仕事はしません)。幸いにも、アップロードはDockerでコンテナ化されています。ドッカーのコンテナの送信トラフィックを遅くするにはどうすればよいですか?ドッカーのコンテナからアップロードをレート制限する方法はありますか?

答えて

6

this questionのおかげで、tc qdisc add dev eth0 root tbf rate 1mbit latency 50ms burst 10000をコンテナ内で実行してアップロード速度を1メガビット/秒に設定できることに気付きました。ここで

はランダムなファイルを生成し、25キロバイト/秒のおおよそのアップロード速度で/dev/null-as-a-serviceにアップロードすることで、これを証明する例Dockerfileです:

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 

オプション​​は、そのネットワークインタフェースを変更するためのコンテナの許可を与える:それはあなたがそれを実行することができ、あなたの現在の作業ディレクトリにあります。ドキュメントhereがあります。

Dockerファイルは、最初に必要な依存関係をインストールします。 iproutetcツールを提供し、curlはレートリミットをリクエストすることができます。依存関係をインストールした後、アップロードする2MBのランダムファイルを生成します。次のセクションでは、レート制限を設定してアップロードを開始するスクリプトファイルを作成します。最後に、コンテナの実行時に実行するアクションとしてスクリプトを指定します。

このコンテナは、25キロバイト/秒への接続を遅くするために、ネットワークインタフェースに、トークンバケツフィルタを追加します。 Token Bucker Filterに提供されるオプションのドキュメントはhereです。

このDockerfileは(もちろん、アップロードが必要ですどんなツールのインストール後)カールの呼び出しを削除し、その場所にアップロードを実行することにより、他のネットワークタスクを実行するように変更することができます。

関連する問題