Docker Windows 容器内存限制

52

Docker Desktop for Windows是否提供默认内存限制?我有一个应用程序,在容器中运行时崩溃,但当我尝试在docker run命令中指定--memory 2048mb参数时,它似乎可以正常运行。至少在它之前崩溃的情况下是这样的。这让我觉得有默认的内存限制,但我在文档中找不到相关信息。所以我的问题是,是否有内存限制,如果有,它在哪里记录?


2
在HyperV隔离模式下(这是桌面操作系统上Windows容器的默认模式),还有一个20GB的磁盘空间限制,但也可以被覆盖。 - Nick Muller
11个回答

35

如果使用WSL 2容器

这似乎是现在的常态(2023年)。您需要在用户配置文件目录中创建/编辑一个文件

cd %UserProfile%
notepad .wslconfig

然后,确保它至少有类似这样的内容:
[wsl2]
memory=6GB   # Limits VM memory in WSL 2 

重新启动您的计算机,您的容器应该会有更多的内存。
(感谢@nessa.gp提供的答案)
如果使用Linux容器
对于我来说,在Windows 10上使用Docker Desktop,我无法使--memory=--cpus=选项起作用。以下是有效的方法:
1. 在系统托盘中右键单击Docker鲸鱼图标,选择“设置”。 2. 在左侧导航栏中选择“资源 -> 高级”。 3. 在这里设置可供容器使用的CPU和内存数量。

enter image description here


11
这些设置适用于 Docker 在 Linux 模式下运行时,该模式使用完整的 Hyper-V 虚拟机。如果切换到 Windows 模式,这些设置将消失。 - Nick Muller
1
是的,但问题是关于 Windows 容器而不是 Linux 容器。顺便说一下,现在有一个新功能,可以在 Windows 模式下运行 Linux 容器。不过仍处于实验阶段。请参见:https://learn.microsoft.com/en-us/virtualization/windowscontainers/deploy-containers/linux-containers#linux-containers-with-hyper-v-isolation - Nick Muller
1
@NickMuller:调整Linux容器的内存大小非常简单,因为它是Docker设置的一部分。对于Windows容器,您需要进入Hyper-V管理器,在右侧窗格下找到DockerDesktopVM下的设置选项。在设置对话框中,您可以动态或静态地调整容器的内存大小。 - KMC
如果在从Windows切换到Linux容器时出现内存限制问题,请参阅https://dev59.com/YK_la4cB1Zd3GeqPpzxW - Oliver Hader
2
附注:在WSL2模式下,设置也会消失。不过它会告诉你如何进行配置。 - Egor Hans
显示剩余2条评论

33
根据Docker for Windows的Github问题讨论(https://github.com/moby/moby/issues/31604),当在Windows 10下运行Docker时,实际上使用的是Hyper-V隔离模型(进程模型在Win 10场景中不可访问)。
在这种隔离类型中,您的容器在轻量级虚拟机内运行,其默认限制为1 Gb。因此,如果要使用更多内存,应使用-m参数。

我在 Windows 2016 上也看到了相同的情况。 - Ivan
27
使用docker-compose时,如何设置内存限制? - Dan
4
我有类似的问题,但是docker在使用docker stats命令查看时,即使我指定更多的内存(使用-m参数),它的最大限制也只有1.943GiB。 - Murray Patterson
@Dan 你找到了吗? - Divisadero
3
@Divisadero,是的,请加入这个mem_limit: 4096m - Dan
请注意:https://dev59.com/0F4b5IYBdhLWcg3wqDOj(jfyi) - Victor

25

使用WSL2,根据这里的文件, 您可以在用户主目录中创建一个.wlsconfig文件,并从PowerShell中输入:

notepad "$env:USERPROFILE/.wslconfig"

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

[wsl2]
memory=3GB   # Limits VM memory in WSL 2 up to 3GB
为了确定您是否在使用WSL2,您可以从Docker界面中进行查看: 这里输入图片描述

4
谢谢。这对我有用。我必须重新启动电脑才能生效。 - Kmeixner
1
我们如何知道它是否达到了3GB? - Martin Žid
当然,这取决于您的机器以及您的工作方式。对我来说,我有16GB的内存,Windows系统已经占用了接近2GB,微软Teams在视频通话时又占用了2GB等等,所以对我来说3GB的内存是足够的。所以,在事情繁忙的时候,请查看任务管理器来粗略估计一下,记得留出一些空间来打开其他应用程序,如果需要的话可以尝试不同的数值来找到适合您的配置。 - nessa.gp

12

惊喜!惊喜!

我在主机上有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层,其中容器是一种轻量级虚拟机。

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


谢谢!你知道限制是来自哪里吗?是Docker设置还是镜像设置? - Andrey M.
说实话我不确定...可能是来自Hyper-V层,因为Windows容器是基于它的。无论如何,你可以使用“-m”选项进行设置,这样问题就解决了,不是吗? - Ivan

10

注意:切换到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

这篇文章真的帮助我搞清楚了:https://www.sqlservercentral.com/blogs/default-resource-limits-for-windows-vs-linux-containers-in-docker-desktop

4

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


2
我们最近也遇到了一个非常类似的问题和疑问,因此我们在Windows上进行了一些有关Docker内存的实验。
看起来这严重依赖于您的配置。如果您以所谓的hyper-v模式运行Docker容器,则内存限制似乎约为512MB。您可以使用“-m”选项扩展给定内存用于Docker运行。指定2GB没有问题。
不幸的是,对于Windows服务器容器,情况完全不同。那里的起始内存限制为1GB,并且您可以使用“-m”选项减少它。我们没有找到一种方法来增加这些容器的内存。
如何查看您的模式/隔离级别:
docker info -f "{{ .Isolation }}"
- Hyper-V 模式; 是 Windows Server。

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


2
我发现在运行docker EE预览的Windows Server 1709(核心版)中,-m参数没有任何效果。你有找到增加[Windows Server]容器内存的方法吗? - FizxMike
1
@FizxMike 我也是,我正在运行一个Kafka容器,虽然我使用了-m分配了4GB内存,但当达到1GB时容器就停止了... - Adhip Rebello

2
要创建一个.wslconfig文件,只需打开文件浏览器,输入并回车%UserProfile%以进入Windows中的个人资料目录。
默认情况下,Docker或WSL2不会创建这些配置文件,因此我们应该自己创建。创建一个名为.wslconfig的新文件(确保末尾没有.txt)。
在该文件中添加以下命令之一(全部或部分)以配置docker。
# 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 桌面应用并重新打开即可。
就这样,享受吧。

0

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


谢谢你的回答。不,我没有很多容器。docker ps -a 只显示我正在使用的 3 个容器。 - Andrey M.

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接