2016-11-04 3 views
4

Мне нужно предотвратить многократную загрузку многоканальной сети из-за использования всей пропускной способности моей сети, но я могу ограничить использование полосы пропускания на уровне процесса (это означает, что замедление сетевого интерфейса всей машины или замедление сетевого трафика этого пользователя работа). К счастью, загрузка контейнеризируется с помощью Docker. Что я могу сделать, чтобы замедлить исходящий трафик контейнера докера?Как ограничить загрузку с контейнера докеров?

ответ

6

Благодаря this question Я понял, что вы можете запустить tc qdisc add dev eth0 root tbf rate 1mbit latency 50ms burst 10000 в контейнере, чтобы установить скорость его загрузки до 1 мегабит/с.

Вот пример Dockerfile, который демонстрирует это путем генерации случайного файла и его загрузки /dev/null-as-a-service при приблизительной скорости загрузки в 25KB/s:

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 позволяет нам сделать запрос, который мы оцениваем. После установки наших зависимостей мы создаем случайный файл размером 2 МБ для загрузки. В следующем разделе создается файл сценария, который настроит ограничение скорости и начнет загрузку. Наконец, мы указываем этот скрипт как действие, которое необходимо предпринять при запуске контейнера.

Этот контейнер добавляет к сети сетевой фильтр Token Bucket, чтобы замедлить соединение до 25 КБ/с. Документацию по параметрам, предоставленным фильтру Token Bucker, можно найти here.

Этот файл Docker можно изменить, чтобы выполнить любую другую сетевую задачу, удалив вызов cURL и выполнив загрузку на своем месте (после установки любых инструментов, необходимых для загрузки, конечно).