Как мне сделать ресурсы контейнера docker взаимоисключающими?

#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
 

Подробнее читайте в документации.