#docker #containers
#docker #контейнеры
Вопрос:
Я хочу, чтобы несколько запущенных контейнеров имели взаимоисключающие ресурсы друг с другом. Например, при наличии ядер ЦП от id0 до id63, если каждому контейнеру выделено 32 ядра ЦП, назначенные им ядра ЦП являются взаимоисключающими. Кроме того, когда у хоста 16 ГБ оперативной памяти, мы хотим выделить 8 ГБ для каждого контейнера, чтобы один контейнер не влиял на использование памяти другим контейнером.
Есть ли хороший способ сделать это?
Комментарии:
1. IMO, большинство людей с этим требованием не продумали это. Вы можете это сделать, но это не основной вариант использования контейнеров. Основная причина в том, что если одна служба простаивает, вы тратите впустую половину своей машины. Если другая служба исчерпала все свои ресурсы, у нее не будет доступа к ресурсам, принадлежащим неработающей службе.
2. Если вы работаете в облачной среде, вы можете добиться этого, получив два отдельных экземпляра вдвое меньшего размера. На самом деле Docker этого не делает.
Ответ №1:
Я думаю, все, что вам нужно, это просто ограничить ресурсы контейнера. Таким образом, вы можете гарантировать, что ни один контейнер не использует более X ядер и / или Y оперативной памяти. Чтобы ограничить использование ЦП до 1 ядра, добавьте --cpus=1.0
в свою docker run
команду. Чтобы ограничить объем оперативной памяти до 8 гигабайт, добавьте -m=8g
. Положить его в целом:
docker run --rm --cpus=1 -m=8g debian:buster cat /dev/stdout
И если вы посмотрите на docker stats
вас, вы увидите, что память ограничена (хотя для процессора это не указано):
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
8d9a33b00950 funny_shirley 0.00% 1MiB / 8GiB 0.10% 6.7kB / 0B 0B / 0B 1
Подробнее читайте в документации.