Ограничение памяти контейнера Windows Docker

Имеют ли контейнеры docker windows с Docker Desktop для Windows ограничение памяти по умолчанию? У меня есть приложение, которое дает сбой, когда я запускаю его в контейнере, но когда я попытался указать параметр --memory 2048mb в команде docker run, похоже, он работает нормально. По крайней мере, в том сценарии, в котором он раньше вылетал. У меня создается впечатление, что есть лимит памяти по умолчанию, но я не смог найти его в документации. Итак, мой вопрос: есть ли предел памяти, и если он задокументирован?


person Andrey M.    schedule 17.04.2017    source источник
comment
К вашему сведению, в режиме изоляции HyperV (который используется по умолчанию для контейнеров Windows на настольных ОС) также существует ограничение на дисковое пространство в 20 ГБ, которое также можно переопределить.   -  person Nicky Muller    schedule 13.06.2019


Ответы (8)


Согласно разговорам о Docker для Windows, проблемы с Github (https://github.com/moby/moby/issues/31604), когда Docker для Windows работает под Windows 10, он фактически использует модель изоляции Hyper-V (а модель процесса недоступна в сценарии Win 10).

И в этом типе изоляции ваш контейнер запускается внутри облегченной виртуальной машины, у которой ДЕЙСТВИТЕЛЬНО есть ограничение по умолчанию, равное 1 Гб. Поэтому, если вы хотите иметь больше памяти, используйте -m param.

person deafsheep    schedule 23.05.2017
comment
Я вижу то же самое и в Windows 2016 - person Ivan; 11.06.2017
comment
Но как вы можете установить этот предел памяти при использовании docker-compose? - person Dan; 16.04.2019
comment
У меня аналогичная проблема, однако докер ограничивается 1,943 ГБ (согласно docker stats), даже если я укажу больше памяти (с -m) - person Murray Patterson; 10.04.2020
comment
@ Дэн Ты узнал? - person Divisadero; 14.04.2020
comment
@Divisadero да, добавьте это mem_limit: 4096m - person Dan; 15.04.2020
comment
jfyi - stackoverflow.com/questions/28837544/ - person Victor; 29.04.2020

При использовании контейнера Linux

Для меня в Windows 10 с использованием Docker Desktop я не мог заставить работать параметры --memory= и --cpus=. Вот что работает:

  1. Щелкните правой кнопкой мыши Docker whale на панели задач и выберите «Настройки».
  2. Перейдите к «Дополнительно» слева
  3. Установите здесь, сколько процессоров и памяти доступно для контейнеров.

введите описание изображения здесь

person Ryan Shillington    schedule 13.06.2019
comment
Эти настройки предназначены для случаев, когда Docker работает в режиме Linux, в котором используется полная виртуальная машина Hyper-v. Если вы переключитесь в режим Windows, эти настройки исчезнут. - person Nicky Muller; 13.06.2019
comment
@NickMuller Полагаю, в режиме Windows я не могу запускать виртуальные машины Linux? Alpine и Ubuntu - это то, что я хочу, поскольку именно так мы развертываем в продукте. - person Ryan Shillington; 13.06.2019
comment
Верно, но речь шла о контейнерах Windows, а не о контейнерах Linux. Кстати, есть новая функция, позволяющая запускать контейнеры Linux в режиме Windows. Тем не менее, все еще экспериментальный. См .: docs.microsoft.com/en-us/virtualization/windowscontainers/ - person Nicky Muller; 14.06.2019
comment
@NickMuller: настроить размер Mem для контейнера linux довольно просто, потому что это часть настроек Docker. Для контейнера Windows вам нужно перейти в диспетчер Hyper-V, и на правой панели есть параметр настройки в разделе DockerDesktopVM. В диалоговом окне Настройка вы можете настроить размер памяти для динамического или статического контейнера, - person KMC; 20.09.2019
comment
Если при переключении с контейнеров Windows на Linux срабатывают ограничения памяти, см. stackoverflow.com/questions/52904104/ - person Oliver Hader; 03.01.2020
comment
В Windows 10 я обнаружил, что после настройки ползунка памяти я смог создать контейнеры, которые использовали более 2 ГБ памяти (что было пределом по умолчанию в моей системе). - person Max; 15.06.2020

Сюрприз! Сюрприз!

У меня на хосте 32 ГБ оперативной памяти, но я вижу только 1 ГБ оперативной памяти, выделенной контейнерам Windows:

D:\>systeminfo | findstr "Memory"
Total Physical Memory:     1,023 MB
Available Physical Memory: 634 MB
Virtual Memory: Max Size:  1,023 MB
Virtual Memory: Available: 674 MB
Virtual Memory: In Use:    349 MB

D:\>wmic OS get FreePhysicalMemory /Value
FreePhysicalMemory=648340

D:\>wmic computersystem get TotalPhysicalMemory
TotalPhysicalMemory
1072742400

Такое же ограничение на изображения, сделанные из:

  • microsoft / windowsservercore
  • микрософт / наносервер

Я думаю, что это исходит от уровня Hyper-V в --isolation=hyperv режиме, где контейнер - это какая-то легкая виртуальная машина.

Вы можете проверить режим изоляции, используемый для вашего существующего контейнера, с помощью команды docker inspect.

person Ivan    schedule 03.05.2017
comment
Спасибо! Вы знаете, откуда берется лимит? Это настройка докера или настройка изображения? - person Andrey M.; 07.05.2017
comment
ТБХ понятия не имею ... может также быть из уровня Hyper-V, поскольку контейнеры Windows основаны на нем. В любом случае вы можете установить его с помощью опции -m, которая решает это, не так ли? - person Ivan; 07.05.2017

ПРИМЕЧАНИЕ. При переключении на контейнеры Linux и игре с параметрами «Ресурсы настроек> Дополнительно» изменяются только ресурсы виртуальной машины для запуска контейнеров Linux, но не контейнеров Windows.

Решение

Чтобы настроить объем памяти и ядер ЦП, используемых для контейнеров Windows, вам нужно будет использовать флаги аргументов --memory и --cpus при запуске образа. Например:

docker run --name myWinImage --memory 4096m --cpus 2 -it -p ‘4096:7880’ --entrypoint powershell

НЕ забудьте добавить букву «m» к номеру, который вы установили для флага --memory, например, «4096m», иначе это не будет иметь никакого эффекта. Также флаг памяти имеет сокращенную версию -m 4096m.

Тестирование

Вы можете убедиться, что установка флагов работает, открыв терминал Powershell для работающего контейнера:

Чтобы проверить память, запустите:

systeminfo | select-string 'Total Physical Memory'`

Чтобы проверить процессоры, запустите:

Get-WmiObject -class Win32_processor | Format-Table Name,NumberOfCores,NumberOfLogicalProcessors`

Эта статья действительно помогла мне понять это: https://www.sqlservercentral.com/blogs/default-resource-limits-for-windows-vs-linux-containers-in-docker-desktop

person b01    schedule 14.01.2020

Запустите Docker QuickStart Terminal

Удалите виртуальную машину по умолчанию:

docker-machine rm default

Восстановите виртуальную машину по умолчанию: в зависимости от ваших требований вы можете изменить значения для различных параметров ниже.

docker-machine create -d virtualbox --virtualbox-cpu-count=2 --virtualbox-memory=4096 --virtualbox-disk-size=50000 default

Тогда сделай

docker-machine stop
exit

Теперь снова откройте терминал быстрого запуска Docker.

Теперь, когда вы запускаете и создаете новый контейнер, у вас по умолчанию будет больше оперативной памяти. Но будьте осторожны, он удалит уже все извлеченные образы докеров.

person user3432888    schedule 29.04.2019

Недавно у нас была очень похожая проблема и вопрос, поэтому мы провели несколько экспериментов с памятью докеров в Windows:

Кажется, что это сильно зависит от вашей конфигурации. Если вы запускаете контейнеры докеров, давайте назовем это режимом hyper-v, ограничение памяти, похоже, составляет около 512 МБ. Вы можете расширить данную память с помощью параметра «-m» для запуска докера. Назначение 2 гб не было проблемой.

К сожалению, для контейнеров Windows Server все по-другому. Там начальный предел памяти составляет 1 ГБ, и вы можете уменьшить его с помощью опции «-m». Мы не нашли способа увеличить объем памяти для этих контейнеров.

Каким вы видите свой режим / уровень изоляции:

docker info -f "{{ .Isolation }}"

hyperv - режим hyper-v; процесс - это сервер Windows

Некоторые дополнительные примечания: очень сложно найти команду, которая выводит доступную память в контейнере. Мы создали собственный тест производительности для получения надежных результатов.

person mugbi    schedule 15.06.2017
comment
Я обнаружил, что -m не работает в Windows Server 1709 (core), на котором запущена предварительная версия docker EE. Вы когда-нибудь находили способ увеличить память для контейнеров [windows server]? - person FizxMike; 25.04.2018
comment
@FizxMike Я тоже использую контейнер Kafka, и хотя я назначил 4 ГБ памяти с помощью -m, контейнер останавливается при ударе 1 ГБ ... - person Adhip Rebello; 12.07.2020

Я думаю, может быть, у вас слишком много мертвых контейнеров. Возможно, попробуйте docker rm $(docker ps -a -q) удалить все закрытые контейнеры, а затем повторите попытку запуска нужного контейнера.

person Bill Cheng    schedule 18.04.2017
comment
Спасибо за Ваш ответ. Нет, у меня мало контейнеров. docker ps -a показывает только 3 контейнера, которые я использую. - person Andrey M.; 18.04.2017

Без ограничений по умолчанию. Документировано здесь

person Myles Keating    schedule 24.04.2017