Docker Desktop for Windows是否提供默认内存限制?我有一个应用程序,在容器中运行时崩溃,但当我尝试在docker run
命令中指定--memory 2048mb
参数时,它似乎可以正常运行。至少在它之前崩溃的情况下是这样的。这让我觉得有默认的内存限制,但我在文档中找不到相关信息。所以我的问题是,是否有内存限制,如果有,它在哪里记录?
Docker Desktop for Windows是否提供默认内存限制?我有一个应用程序,在容器中运行时崩溃,但当我尝试在docker run
命令中指定--memory 2048mb
参数时,它似乎可以正常运行。至少在它之前崩溃的情况下是这样的。这让我觉得有默认的内存限制,但我在文档中找不到相关信息。所以我的问题是,是否有内存限制,如果有,它在哪里记录?
这似乎是现在的常态(2023年)。您需要在用户配置文件目录中创建/编辑一个文件。
cd %UserProfile%
notepad .wslconfig
[wsl2]
memory=6GB # Limits VM memory in WSL 2
--memory=
和--cpus=
选项起作用。以下是有效的方法:docker stats
命令查看时,即使我指定更多的内存(使用-m
参数),它的最大限制也只有1.943GiB。 - Murray Pattersonmem_limit: 4096m
。 - Dan使用WSL2,根据这里的文件, 您可以在用户主目录中创建一个.wlsconfig文件,并从PowerShell中输入:
notepad "$env:USERPROFILE/.wslconfig"
文件内容限制内存的如下:
[wsl2]
memory=3GB # Limits VM memory in WSL 2 up to 3GB
为了确定您是否在使用WSL2,您可以从Docker界面中进行查看:
惊喜!惊喜!
我在主机上有32Gb的RAM,但我只能看到Windows容器给出了1Gb的RAM:
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
来自以下镜像的图像数量限制相同:
我认为这是来自--isolation=hyperv
模式下的Hyper-V层,其中容器是一种轻量级虚拟机。
您可以通过docker inspect
命令检查现有容器使用的隔离模式。
注意:切换到Linux容器并调整“设置资源>高级”选项只会修改运行Linux容器的VM资源,而不是Windows容器。
要调整用于Windows容器的内存和CPU核心数量,您需要在运行镜像时使用--memory
和--cpus
参数标志。例如:
docker run --name myWinImage --memory 4096m --cpus 2 -it -p ‘4096:7880’ --entrypoint powershell
--memory
标志后设置数字时添加“m”,例如“4096m”,否则它将不起作用。同时,内存标志还有一个短版本-m 4096m
。
您可以通过打开运行中容器的Powershell终端来验证设置标志是否有效:
要检查内存,请运行:
systeminfo | select-string 'Total Physical Memory'
检查 CPU,运行以下命令:
Get-WmiObject -class Win32_processor | Format-Table Name,NumberOfCores,NumberOfLogicalProcessors
运行Docker QuickStart终端
删除默认虚拟机:
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 快速启动终端
现在,当你运行并创建一个新的容器时,默认情况下将拥有更多的 RAM 内存。 但要小心,它会删除已拉取的所有 Docker 镜像。
docker info -f "{{ .Isolation }}"
- Hyper-V 模式; 是 Windows Server。
附加说明:很难找到一个输出容器可用内存的命令。我们创建了自己的性能测试以获得可靠的结果。
# Settings apply across all Linux distros running on WSL 2
[wsl2]
# Limits VM memory to use no more than 4 GB, this can be set as whole
numbers using GB or MB
memory=4GB
# Sets the VM to use two virtual processors
processors=2
# Specify a custom Linux kernel to use with your installed distros.
kernel=C:\\temp\\myCustomKernel
# Sets additional kernel parameters, in this case enabling older Linux base images such as Centos 6
kernelCommandLine = vsyscall=emulate
# Sets amount of swap storage space to 8GB, default is 25% of available RAM
swap=8GB
# Sets swapfile path location, default is %USERPROFILE%\AppData\Local\Temp\swap.vhdx
swapfile=C:\\temp\\wsl-swap.vhdx
# Disable page reporting so WSL retains all allocated memory claimed from Windows and releases none back when free
pageReporting=false
# Turn off default connection to bind WSL 2 localhost to Windows localhost
localhostforwarding=true
# Disables nested virtualization
nestedVirtualization=false
# Turns on output console showing contents of dmesg when opening a WSL 2 distro for debugging
debugConsole=true
我认为可能是你有太多的死亡容器。也许尝试使用docker rm $(docker ps -a -q)
来删除所有已退出的容器,然后重试运行你想要的容器。
docker ps -a
只显示我正在使用的 3 个容器。 - Andrey M.您还可以通过编辑json文件C:\Users\Personal\AppData\Roaming\Docker\settings.json来设置docker使用的内存。查找名为MemoryMiB的属性,并将其值更新为您希望docker安装使用的兆字节数。