Как ограничить скорость загрузки из контейнера докеров?

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


person Christopher Waldon    schedule 04.11.2016    source источник


Ответы (1)


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

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

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 дает контейнеру разрешение на изменение своего сетевого интерфейса. Вы можете найти документацию здесь.

Dockerfile сначала устанавливает необходимые ему зависимости. iproute предоставляет инструмент tc, а curl позволяет нам сделать запрос на ограничение скорости. После установки наших зависимостей мы создаем случайный файл размером 2 МБ для загрузки. В следующем разделе создается файл сценария, который настроит ограничение скорости и начнет загрузку. Наконец, мы указываем этот сценарий как действие, которое необходимо выполнить при запуске контейнера.

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

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

person Christopher Waldon    schedule 04.11.2016