带有Docker Desktop for Windows的 docker windows 容器是否有默认内存限制?我有一个应用程序在容器中运行时崩溃,但是当我尝试为命令指定--memory 2048mb
参数时,docker run
它似乎运行良好。至少在它之前崩溃的情况下。这给我的印象是有默认内存限制,但我在文档中找不到它。所以我的问题是有内存限制,如果它在哪里记录?
9 回答
根据关于 Docker for windows Github 问题的讨论(https://github.com/moby/moby/issues/31604),当 Docker for Windows 在 Windows 10 下运行时,它实际上是使用 Hyper-V 隔离模型(和进程模型在 Win 10 场景中无法访问)。
在这种隔离类型中,您的容器在轻量级 VM 中运行,该 VM 具有默认限制,并且为 1 Gb。所以如果你想拥有更多的内存,你应该使用 -m 参数。
惊喜!惊喜!
我的主机上有 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
对以下图像的相同限制:
- 微软/windowsservercore
- 微软/纳米服务器
我认为它来自--isolation=hyperv
模式中的 Hyper-V 层,其中容器是某种轻量级 VM。
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
在“4096m”中为标志设置的数字附加一个“m”,否则它将无效。内存标志也有一个简短的版本-m 4096m
。
测试
您可以通过将Powershell终端打开到正在运行的容器来验证设置标志是否有效:
要检查内存,请运行:
systeminfo | select-string 'Total Physical Memory'`
要检查 CPU,请运行:
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 快速入门终端
删除默认虚拟机:
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 镜像。
使用 WSL2,如此处所述,您可以在用户主目录中创建一个 .wlsconfig 文件,从 PowerShell 中键入:
notepad "$env:USERPROFILE/.wslconfig"
并且限制内存的文件内容如下:
[wsl2]
memory=3GB # Limits VM memory in WSL 2 up to 3GB
我们最近遇到了一个非常相似的问题和疑问,因此在 windows 上用 docker memory 做了一些实验:
似乎它在很大程度上取决于您的配置。如果您在 docker 容器中运行,我们称之为 hyper-v 模式,内存限制似乎约为 512mb。您可以使用 docker run 的“-m”选项扩展给定的内存。分配 2 GB 不是问题。
不幸的是,Windows 服务器容器完全不同。那里的起始内存限制为 1gb,您可以使用“-m”选项减少它。我们没有找到增加这些容器内存的方法。
您如何看待您的模式/隔离级别:
docker info -f "{{ .Isolation }}"
hyperv - hyper-v 模式;进程是windows server
一些附加说明:很难找到输出容器中可用内存的命令。我们创建了自己的性能测试以获得可靠的结果。
我认为可能是您的死容器太多。也许尝试docker rm $(docker ps -a -q)
删除所有退出的容器,然后重试运行您想要的容器。
没有默认限制。记录在这里