首页 > 解决方案 > 如何在 Linux 上的 VirtualBox 上在 Windows 上运行 Docker?

问题描述

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

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

在 VirtualBox 上的 VM 设置中,我检查了“启用嵌套 VT-x/AMD-V”、半虚拟化下的“Hyper-V”和“启用嵌套分页”。然后我运行我的 Win10 Pro 安装。Speccy 显示“虚拟化:支持,启用”。已安装并运行 WSL 2 以及 Hyper-V 和虚拟机平台功能。当我运行 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

在此处输入图像描述

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

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

VirtualBox 版本是 6.1.10 r138449。

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

标签: linuxwindowsdockervirtualboxvirtualization

解决方案


Docker for Windows 需要启用 Hyper-V,因为它使 Mobylinux 在那里运行基于 linux 的容器,并且启用后,您将无法运行 VMWare Workstation 或 Virtual Box。

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

要运行 Windows 容器,您必须从托盘图标更改 docker 的设置并选择允许 Windows 本机容器的设置,请参阅图像以更改为 Windows 容器。在此之后,您可以像这里一样部署 Windows 容器。

你也可以看看这个线程


推荐阅读