Docker windows 容器内存限制

Docker windows container memory limit

dockerwindows 容器,Docker 桌面 Windows,是否有默认内存限制? 当我在容器中 运行 时,我有一个应用程序崩溃了,但是当我尝试为 docker run 命令指定 --memory 2048mb 参数时,它似乎 运行 正常。至少在之前崩溃的情况下。这给我的印象是有默认内存限制,但我在文档中找不到它。所以我的问题是有内存限制吗?是否有记录?

我想可能是你的死容器太多了。也许尝试 docker rm $(docker ps -a -q) 删除所有退出的容器,然后重试 运行 您想要的容器。

没有默认限制。已记录 here

惊喜!惊喜!

我的主机上有 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

对来自以下来源的图像的相同限制:

  • microsoft/windowsservercore
  • microsoft/nanoserver

我认为它来自 --isolation=hyperv 模式下的 Hyper-V 层,其中容器是某种轻量级 VM。

您可以通过 docker inspect 命令检查现有容器使用的隔离模式。

根据关于 Docker for windows Github issues (https://github.com/moby/moby/issues/31604) 的讨论,当 Docker for Windows 是 运行在Windows10下,其实是使用了Hyper-V隔离模型(而且进程模型在Win 10场景下是访问不到的)。

并且在该隔离类型中,您的容器 运行 位于轻量级 VM 中,它确实有默认限制,即 1 Gb。所以如果你想拥有更多内存,你应该使用 -m 参数。

我们最近有一个非常相似的问题和问题,因此在 windows 上用 docker 内存做了一些实验:

看来这在很大程度上取决于您的配置。 如果你 运行 docker 容器,让我们称之为 hyper-v 模式,内存限制似乎是大约 512mb。您可以使用 docker 运行 的“-m”选项扩展给定的内存。分配 2 GB 不是问题。

不幸的是,windows 服务器容器完全不同。起始内存限制为 1gb,您可以使用“-m”选项减少它。我们没有找到增加这些容器内存的方法。

您如何看待自己的 mode/isolation 水平:

docker info -f "{{ .Isolation }}"

hyperv - hyper-v 模式; 进程是windows服务器

一些附加说明:很难找到一个命令来输出容器中的可用内存。我们已经创建了自己的性能测试以获得可靠的结果。

运行 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 个图像。

如果使用 Linux 容器

对我来说,在 Windows 10 上使用 Docker 桌面,我无法使用 --memory=--cpus= 选项。这是有效的方法:

  1. 右键单击系统托盘中的 Docker whale 并选择“设置”
  2. 转到左侧的“资源 -> 高级”
  3. 在此处设置容器可用的 CPU 和内存数量。

注意:切换到 Linux 容器并使用 "Settings Resources > Advanced" 选项只会修改 运行ning [=45] 的 VM 资源=] 个容器,而不是 Windows 个容器。

解决方案

要调整用于 Windows 容器的内存和 CPU 内核数量,您需要在 [=47] 时使用 --memory--cpus 参数标志=] 图片。例如:

docker run --name myWinImage --memory 4096m --cpus 2 -it -p ‘4096:7880’ --entrypoint powershell

不要忘记附加一个 "m" 和您为 --memory 标志设置的数字,如“4096m”,否则它将无效。内存标志也有一个短版本 -m 4096m.

测试

您可以通过打开 Powershell 终端到 运行ning 容器来验证设置标志​​是否有效:

检查内存,运行:

systeminfo | select-string 'Total Physical Memory'`

检查CPUs,运行:

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

使用 WSL2,如 here 所述,您可以在用户主目录中创建一个 .wlsconfig 文件,从 PowerShell 中键入:

notepad "$env:USERPROFILE/.wslconfig"

而限制内存的文件内容如下:

[wsl2]
memory=3GB   # Limits VM memory in WSL 2 up to 3GB

为了查看您是否在使用 WSL2,您可以从 docker 界面执行此操作:

您还可以通过编辑 json 文件 C:\Users\Personal\AppData\Roaming\Docker\settings.json 来设置 docker 使用的内存。查找名为 MemoryMiB 的 属性 并将其值更新为您希望 docker 安装使用的兆字节数。