【问题标题】:Docker windows container memory limitDocker windows容器内存限制
【发布时间】:2017-09-13 14:52:15
【问题描述】:

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

【问题讨论】:

  • 仅供参考,在 HyperV 隔离模式下(这是桌面操作系统上 Windows 容器的默认设置)还有 20GB 的磁盘空间限制,也可以覆盖。

标签: docker docker-for-windows docker-desktop


【解决方案1】:

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

【讨论】:

  • 感谢您的回答。不,我没有太多容器。 docker ps -a 只显示了我使用的 3 个容器。
【解决方案2】:

没有默认限制。记录在案的here

【讨论】:

    【解决方案3】:

    惊喜!惊喜!

    我的主机上有 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
    • 微软/纳米服务器

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

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

    【讨论】:

    • 谢谢!你知道这个限制是从哪里来的吗?是docker设置还是image设置?
    • TBH 不知道...也可能来自 Hyper-V 层,因为 Windows 容器基于它。无论如何,您可以使用“-m”选项设置它,它可以解决它,不是吗?
    【解决方案4】:

    根据关于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 参数。

    【讨论】:

    • 我在 Windows 2016 上也看到了同样的情况
    • 但是在使用 docker-compose 时如何设置这个内存限制呢?
    • 我有一个类似的问题,但是 docker 上限为 1.943GiB(根据 docker stats),即使我指定了更多内存(使用 -m
    • @Dan 你发现了吗?
    • @Divisadero 是的,添加这个mem_limit: 4096m
    【解决方案5】:

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

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

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

    您如何看待自己的模式/隔离级别:

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

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

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

    【讨论】:

    • 我发现 -m 在运行 docker EE preview 的 Windows Server 1709 (core) 中不起作用。你有没有找到一种方法来“增加 [windows server] 容器的内存?
    • @FizxMike 我也是,我正在运行一个 Kafka 容器,虽然我使用 -m 分配了 4GB 内存,但容器在达到 1GB 时停止......
    【解决方案6】:

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

    【讨论】:

      【解决方案7】:

      如果使用 Linux 容器

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

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

      【讨论】:

      • 这些设置适用于 Docker 在 Linux 模式下运行时,该模式使用完整的 hyper-v 虚拟机。如果切换到 Windows 模式,这些设置就会消失。
      • @NickMuller 在 Windows 模式下,我猜我无法运行 Linux 虚拟机? Alpine 和 Ubuntu 是我想要的,因为这就是我们在产品中部署的方式。
      • 没错,但问题是关于 Windows 容器,而不是 Linux 容器。顺便说一句,有一个新功能可以在 Windows 模式下运行 Linux 容器。虽然仍然是实验性的。见:docs.microsoft.com/en-us/virtualization/windowscontainers/…
      • @NickMuller :调整 linux 容器的内存大小非常简单,因为它是 Docker 设置的一部分。对于 Windows 容器,您需要转到 Hyper-V 管理器,在右侧窗格中,DockerDesktopVM 下有一个设置选项。在设置对话框中,您可以为容器动态或静态调整内存大小,
      • 如果从 Windows 切换到 Linux 容器时出现内存限制,请参阅stackoverflow.com/questions/52904104/…
      【解决方案8】:

      注意:切换到 Linux 容器并使用“设置资源 > 高级”选项只会修改运行 Linux 容器的 VM 资源,而不是 Windows 容器。

      解决方案

      要调整用于 Windows 容器的内存和 CPU 内核数量,您需要在运行映像时使用 --memory--cpus 参数标志。例如:

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

      不要忘记在“4096m”中为--memory 标志设置的数字附加一个“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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-09-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多