如何在Linux上的VirtualBox中运行Windows上的Docker?

8

主机系统为Archlinux。我想开发需要运行Windows docker容器的.NET 4.6.1应用程序。因此,我在VirtualBox下运行Win10。然后,我在Win10中安装Docker以运行Windows docker容器。Linux -> VirtualBox -> Win10 -> Docker -> Windows docker容器 -> 应用程序。

更具体地说,VirtualBox是否支持WSL 2虚拟化Windows 10(自2020年5月更新起可用)?

在我的VirtualBox的VM设置中,我勾选了 "启用嵌套VT-x/AMD-V"、"Hyper-V"和 "启用嵌套分页"。然后我运行我的Win10 Pro安装。Speccy显示“虚拟化:支持,已启用”。WSL 2已安装并运行,Hyper-V和Virtual Machine Platform功能也已启用。当我运行Docker时,会出现以下错误。

System.InvalidOperationException:
Failed to deploy distro docker-desktop to C:\Users\WinUser\AppData\Local\Docker\wsl\distro: exit code: -1
 stdout: Please enable the Virtual Machine Platform Windows feature and ensure virtualization is enabled in the BIOS.
For information please visit https://aka.ms/wsl2-install

 stderr: 
   at Docker.Core.WslShortLivedCommandResult.LogAndThrowIfUnexpectedExitCode(String prefix, ILogger log, Int32 expectedExitCode) in C:\workspaces\stable-2.3.x\src\github.com\docker\pinata\win\src\Docker.Core\WslCommand.cs:line 119
   at Docker.Engines.WSL2.WSL2Provisioning.<DeployDistroAsync>d__16.MoveNext() in C:\workspaces\stable-2.3.x\src\github.com\docker\pinata\win\src\Docker.Desktop\Engines\WSL2\WSL2Provisioning.cs:line 142
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Docker.Engines.WSL2.WSL2Provisioning.<ProvisionAsync>d__6.MoveNext() in C:\workspaces\stable-2.3.x\src\github.com\docker\pinata\win\src\Docker.Desktop\Engines\WSL2\WSL2Provisioning.cs:line 44
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Docker.Engines.WSL2.LinuxWSL2Engine.<DoStartAsync>d__23.MoveNext() in C:\workspaces\stable-2.3.x\src\github.com\docker\pinata\win\src\Docker.Desktop\Engines\WSL2\LinuxWSL2Engine.cs:line 91
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Docker.ApiServices.StateMachines.TaskExtensions.<WrapAsyncInCancellationException>d__0.MoveNext() in C:\workspaces\stable-2.3.x\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\TaskExtensions.cs:line 29
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
   at Docker.ApiServices.StateMachines.StartTransition.<DoRunAsync>d__5.MoveNext() in C:\workspaces\stable-2.3.x\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\StartTransition.cs:line 67
--- End of stack trace from previous location where exception was thrown ---
   at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
   at Docker.ApiServices.StateMachines.StartTransition.<DoRunAsync>d__5.MoveNext() in C:\workspaces\stable-2.3.x\src\github.com\docker\pinata\win\src\Docker.ApiServices\StateMachines\StartTransition.cs:line 92

在这里输入图片描述

更新: 当我选择使用KVM或Hyper-V作为VirtualBox机器的半虚拟化选项时,Docker报告虚拟化被禁用。Windows的任务管理器显示它是一台虚拟机。当我选择无半虚拟化选项时,Windows显示它不是虚拟机并启用了虚拟化(在任务管理器中),但Docker报告“必须在BIOS中启用硬件辅助虚拟化和数据执行保护”(在Windows中启用了这些功能:虚拟机平台、Hyper-V、WSL)。

我的机器是Intel(R) Core(TM) i7-9850H CPU @ 2.60GHz

VirtualBox版本是6.1.10 r138449。

在VMWare 15.5.6下它可以正常工作(Win10-> Docker)。


@Artyom,你之前的问题不够清晰。这次编辑后更好了,已点赞。 - isAif
你是否正在使用默认的Linux容器之外的Windows容器 - Dupinder Singh
只需解释您的问题以及迄今为止所做的事情,这就足以帮助您了。 - Dupinder Singh
1
@DupinderSingh 谢谢。我已经阅读了这篇文章。这个问题是关于新的 WSL 2。 - Artyom
有没有办法重新打开这个问题? 我在Virtualbox中的虚拟Windows 10框中遇到了与WSL2启动相关的相同问题。 如果这也是你的问题,那么这个问题很明确且符合主题。 我们能否重新打开它或者被告知去哪里提问? - Guidhouse
显示剩余8条评论
1个回答

1

Docker for Windows需要启用Hyper-V,这使得Mobylinux可以运行基于Linux的容器,当启用后,您将无法运行VMWare Workstation或Virtual Box。

如果您想在虚拟机上运行Docker,则取消选中Hyper-V框,并创建所需的Linux虚拟机(例如ArchLinux、centOS等),然后安装Docker在该Linux虚拟机上以运行/部署容器。

要运行Windows容器,您必须从托盘图标更改docker的设置,并选择允许Windows本地容器的设置,请参见Image以更改为Windows容器。之后,您就可以像here一样部署Windows容器了。

您也可以查看thread


1
不理解。当我在VMWare中运行Windows时,我可以使用Hyper-V(它在那里工作)。另外,我不明白为什么要在运行在Linux上的VirtualBox中创建运行在Windows 10上的Linux虚拟机(什么鬼?)。问题是如何运行Windows Docker容器。我会给这个答案投反对票。 - Artyom

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