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


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

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

6 65

6 ответов:

память/процессор

Docker теперь поддерживает больше вариантов распределения ресурсов:

  • CPU shares, via-C flag
  • ограничение памяти, флаг via-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"

для хранения

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

теперь вы можете выделить несколько общих ресурсов процессора для контейнера с опцией-c, как описано здесь

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

Примечание: PR 15078 реализует (декабря. 2015) поддержка изменения ресурсов как для остановленных и под управлением контейнер (возможно docker 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 должны сохраняться.
Т. е. эти изменения будут постоянными (обновлены в контейнере JSON)

просто заметка о -m / --memory--

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

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

смотрите эту суть:https://gist.github.com/afolarin/15d12a476e40c173bf5f

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

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

--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"

RAM:

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