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