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