Служба docker в Windows 10, похоже, всегда использует максимальный объем памяти, который ей разрешено выделить. Например, когда я увеличил память в разделе Resources -> Advanced с 2 ГБ до 8 ГБ и нажал «Apply & Restart», в диспетчере задач произошло следующее:
Как заставить Docker использовать память только тогда, когда это необходимо запущенным контейнерам, а не просто пожирать ее всю?
В настоящее время контейнеры не запущены, работает только служба.
решение1
Хотя Docker отличается от полной аппаратной виртуализации, он по-прежнему функционирует во многом так же и по тем же причинам.
Гипервизоры резервируют заданный объем памяти для того, чтобы эта память была доступна им и контейнерам (или виртуальным машинам), когда она им потребуется, без необходимости запрашивать эту память у ОС.
Настройка, которую вы устанавливаете, предназначена специально для этой цели и ведет себя именно так, как вы наблюдали, именно по этой причине. Это не ошибка, и изменить ее поведение — значит переписать базовое поведение Docker.
Итак, ничего не сломалось и все работает так, как и должно.
Я настоятельно рекомендую вам почитать о резервировании памяти в Docker, чтобы лучше понять, как и почему. Docker — это зрелый продукт, и я полагаю, он хорошо документирован.
Чтобы «решить» проблему, с которой вы столкнулись, установите больше памяти или более тщательно спланируйте потребности Docker в памяти и используйте эту настройку так, как она была задумана, а не просто так, как вы делаете сейчас.
решение2
Запуск новых версий docker desktop с бэкэндом WSL2 решает эту проблему. Я не могу дать больше подробностей, так как сам не очень хорошо в этом разбираюсь, но я установил WSL2 и заметил, что docker теперь выделяет память динамически.
Docker Desktop использует функцию динамического распределения памяти в WSL 2 для значительного улучшения потребления ресурсов. Это означает, что Docker Desktop использует только необходимое количество ресурсов ЦП и памяти, позволяя при этом значительно ускорить выполнение задач, интенсивно использующих ЦП и память, таких как сборка контейнера.
Источник:Docker Desktop WSL 2 бэкэнд