Windows Docker进程隔离模式下内存分配不生效,设置50GB仅使用12.64GB
问题核心原因排查
你遇到的12.64GB上限完全匹配Windows客户端系统(Win10/Win11)运行process隔离Windows容器的默认内存限制:客户端系统默认将Windows容器的内存上限限制为宿主机物理内存的20%,如果你的宿主机物理内存为64GB,20%恰好接近12.8GB,和你观测的数值一致。
先澄清你配置中的误区
你当前daemon.json中配置的dm.basesize=40G是devicemapper存储驱动的可写层大小配置,和容器内存限制完全无关,无法解决你的问题。
逐一排查修复方案
- 第一步:确认代码中
containerMemory参数的单位是否正确
Docker.DotNet中HostConfig.Memory的单位为字节,如果你要分配50GB内存,需要将containerMemory赋值为50L * 1024 * 1024 * 1024 = 53687091200,如果直接传入50或者单位换算错误,会触发默认内存限制。 - 第二步:解除Windows客户端系统的默认容器内存上限
微软对非Server版Windows系统的Windows容器做了全局资源限制,需要修改注册表解除:- 打开注册表编辑器,定位到
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\hcimon\Parameters - 新建
DWORD(32位)值,名称为DisableRootMemoryLimit,数值设置为1 - 重启宿主机生效
- 打开注册表编辑器,定位到
- 第三步:配置Docker daemon的默认容器内存上限(可选)
如果你需要给所有process隔离的Windows容器统一默认内存,可以在daemon.json中添加如下配置,重启Docker服务生效:{ "default-ulimits": { "memlock": { "Name": "memlock", "Hard": 53687091200, "Soft": 53687091200 } } } - 第四步:验证配置生效
容器创建完成后执行命令docker inspect 你的容器ID,查看返回结果中HostConfig.Memory字段值是否等于你设置的字节数,同时执行docker stats查看容器的内存上限是否符合预期。
内容的提问来源于stack exchange,提问作者Rafał Developer
相关产品推荐
相关产品推荐

