Имеют ли контейнеры docker windows с Docker Desktop для Windows ограничение памяти по умолчанию? У меня есть приложение, которое дает сбой, когда я запускаю его в контейнере, но когда я попытался указать параметр --memory 2048mb
в команде docker run
, похоже, он работает нормально. По крайней мере, в том сценарии, в котором он раньше вылетал. У меня создается впечатление, что есть лимит памяти по умолчанию, но я не смог найти его в документации. Итак, мой вопрос: есть ли предел памяти, и если он задокументирован?
Ограничение памяти контейнера Windows Docker
Ответы (8)
Согласно разговорам о Docker для Windows, проблемы с Github (https://github.com/moby/moby/issues/31604), когда Docker для Windows работает под Windows 10, он фактически использует модель изоляции Hyper-V (а модель процесса недоступна в сценарии Win 10).
И в этом типе изоляции ваш контейнер запускается внутри облегченной виртуальной машины, у которой ДЕЙСТВИТЕЛЬНО есть ограничение по умолчанию, равное 1 Гб. Поэтому, если вы хотите иметь больше памяти, используйте -m param.
docker stats
), даже если я укажу больше памяти (с -m
)
- person Murray Patterson; 10.04.2020
mem_limit: 4096m
- person Dan; 15.04.2020
При использовании контейнера Linux
Для меня в Windows 10 с использованием Docker Desktop я не мог заставить работать параметры --memory=
и --cpus=
. Вот что работает:
- Щелкните правой кнопкой мыши Docker whale на панели задач и выберите «Настройки».
- Перейдите к «Дополнительно» слева
- Установите здесь, сколько процессоров и памяти доступно для контейнеров.
Сюрприз! Сюрприз!
У меня на хосте 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
.
ПРИМЕЧАНИЕ. При переключении на контейнеры 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
Запустите 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.
Теперь, когда вы запускаете и создаете новый контейнер, у вас по умолчанию будет больше оперативной памяти. Но будьте осторожны, он удалит уже все извлеченные образы докеров.
Недавно у нас была очень похожая проблема и вопрос, поэтому мы провели несколько экспериментов с памятью докеров в Windows:
Кажется, что это сильно зависит от вашей конфигурации. Если вы запускаете контейнеры докеров, давайте назовем это режимом hyper-v, ограничение памяти, похоже, составляет около 512 МБ. Вы можете расширить данную память с помощью параметра «-m» для запуска докера. Назначение 2 гб не было проблемой.
К сожалению, для контейнеров Windows Server все по-другому. Там начальный предел памяти составляет 1 ГБ, и вы можете уменьшить его с помощью опции «-m». Мы не нашли способа увеличить объем памяти для этих контейнеров.
Каким вы видите свой режим / уровень изоляции:
docker info -f "{{ .Isolation }}"
hyperv - режим hyper-v; процесс - это сервер Windows
Некоторые дополнительные примечания: очень сложно найти команду, которая выводит доступную память в контейнере. Мы создали собственный тест производительности для получения надежных результатов.
Я думаю, может быть, у вас слишком много мертвых контейнеров. Возможно, попробуйте docker rm $(docker ps -a -q)
удалить все закрытые контейнеры, а затем повторите попытку запуска нужного контейнера.
docker ps -a
показывает только 3 контейнера, которые я использую.
- person Andrey M.; 18.04.2017