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

Как название этого вопроса предполагает, что я хочу установить максимальный объем дискового пространства/памяти и процессора для контейнера с помощью docker (docker.io).

Есть ли способ сделать это, используя только докер?

Ответ 1

памяти/ЦП

Теперь Docker поддерживает дополнительные возможности выделения ресурсов:

  • ЦП, через флаг -c
  • Предел памяти, через флаг -m
  • Конкретные ядра процессора, через флаг --cpuset

Посмотрите docker run --help для более подробной информации.

Если вы используете lxc backend (docker -d --exec-driver=lxc), можно указать более мелкие схемы выделения ресурсов, например:

docker run --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"\
           --lxc-conf="lxc.cgroup.cpu.shares = 1234"

хранения

Ограничение хранения на данный момент немного сложнее. Для получения дополнительной информации см. Следующие ссылки:

Ответ 2

Теперь вы можете выделить несколько долей ЦП в контейнер с параметром -c, как описано здесь

Ответ 3

Вы можете передать только предел памяти (т.е. предел 5 МБ: запуск докера -m = 5242880... изображение), как я знаю. Но ребята из docker.io планировали добавить пределы процессора.

Ответ 4

Примечание: PR 15078 реализует (декабрь 2015 г.) поддержку для изменения ресурсов как для остановленного, так и для запуска контейнера (возможно, докер 1.10 ou 1.11)

Мы решили разрешить устанавливать то, что мы называем ресурсами, которые теперь состоят из cgroup thingies, следовательно, PR # 18073.
Единственные разрешенные изменяемые элементы контейнера находятся в HostConfig и точно в ресурсах (см. struct).

resources := runconfig.Resources{
        BlkioWeight:       *flBlkioWeight,
        CpusetCpus:        *flCpusetCpus,
        CpusetMems:        *flCpusetMems,
        CPUShares:         *flCPUShares,
        Memory:            flMemory,
        MemoryReservation: memoryReservation,
        MemorySwap:        memorySwap,
        KernelMemory:      kernelMemory,
        CPUPeriod:         *flCPUPeriod,
        CPUQuota:          *flCPUQuota,
    }
  • Команда должна быть set.
  • Разрешенные изменения передаются как флаги: например. --memory=1Gb --cpushare=… (как это делает PR).
  • Существует один флаг для каждого атрибута структуры Resources (и не более, не менее).

Обратите внимание, что внесение изменений через docker set должно сохраняться.
I.e., эти изменения будут постоянными (обновляется в контейнере JSON).

Ответ 5

Только примечание о -m / --memory -

Если вы устанавливаете ограничение памяти, но контейнер не выделяет объем памяти, который вы пытаетесь зарезервировать, перейдите в настройки и настройте память, зарезервированную для приложения-докера в целом.

Я столкнулся с этой "проблемой" на OS X и не был уверен, почему мой контейнер был ограничен ~ 2G, когда я указывал --memory=8g

Ответ 6

см. этот смысл: https://gist.github.com/afolarin/15d12a476e40c173bf5f

1) Вы даете относительную долю в cpus с --cpu-share = 'relative-number'

2) теперь вы можете установить жесткие ограничения на cpus:

--cpuset=""
specify which cpus by numeric id, 0=first, n=nth cpu. specify by contiguous "1-5" or discontiguous "1,3,5" ranges.

если использовать LXC вместо стандартного libcontainer, вы также можете указать это в:

--lxc-conf=[]              
(lxc exec-driver only) Add custom lxc options --lxc-conf="lxc.cgroup.cpuset.cpus = 0,1"

Оперативная память:

-m, --memory=""            Memory limit (format: <number><optional unit>, where unit = b, k, m or g)