Docker windows container memory limit
Does docker windows containers, with Docker Desktop for Windows, have default memory limit?
I have an application that was crashing when I run it in the container, but when I tried to specify --memory 2048mb
parameter to the docker run
command it seems to run fine. At least in the scenario where it was crashing before. This gives me impression that there is default memory limit, but I could not find it in the documentation. So my question is there memory limit and if it is where it is documented?
According to talks on Docker for windows Github issues (https://github.com/moby/moby/issues/31604), when Docker for Windows is run under Windows 10, it is actually using a Hyper-V isolation model (and process model is not accessible in Win 10 scenario).
And in that isolation type, your container is run inside a lightweight VM, which DOES have a default limit, and it is 1 Gb. So if you want to have more memory you should use -m param.
If using a Linux container
For me, on Windows 10 using Docker Desktop, I could not get the --memory=
and --cpus=
options to work. Here's what does work:
- Right click on the Docker whale in the system tray and choose "Settings"
- Go to "Resources -> Advanced" on the left
- Set how many CPUs and memory is available to containers here.
Surprise! Surprise!
I have 32Gb RAM on my host but I can see only 1Gb RAM given to Windows containers:
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
The same limit on images made from:
- microsoft/windowsservercore
- microsoft/nanoserver
I think it's coming from the Hyper-V layer in --isolation=hyperv
mode, where a container is some sort of lightweight VM.
You can check isolation mode used for your existing container by docker inspect
command.
NOTE: Switching to Linux containers and playing with the "Settings Resources > Advanced" options only modifies the VM resources for running Linux containers, and not Windows containers.
Solution
To adjust the amount of memory and CPU cores used for Windows containers you will need to use the --memory
and --cpus
argument flags when you run the image. For example:
docker run --name myWinImage --memory 4096m --cpus 2 -it -p ‘4096:7880’ --entrypoint powershell
Do NOT forget to append an "m" with number you set for the --memory
flag as in "4096m" or it will have no effect. Also the memory flag has a short version -m 4096m
.
Testing
You can verify that setting the flags worked by opening a Powershell terminal to the running container:
To check memory, run:
systeminfo | select-string 'Total Physical Memory'`
To check CPUs, run:
Get-WmiObject -class Win32_processor | Format-Table Name,NumberOfCores,NumberOfLogicalProcessors`
This article really helped me figure it out: https://www.sqlservercentral.com/blogs/default-resource-limits-for-windows-vs-linux-containers-in-docker-desktop