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

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

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

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