linux - 如何在 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)。
解决方案
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 容器。
你也可以看看这个线程。
推荐阅读
- c++ - 是否有任何方便的方法来检查 Eclipse 中类的成员变量的值?
- html - 如何获取循环中生成的项目并将它们放在 flexbox 的页面上?
- flutter - 在 Flutter 中使用 BLoC 模式?
- html-email - 当我在 Outlook 中预览时,我的一张桌子掉了下来
- excel - 使用 Excel 16 更新 MDB 记录 - ActiveX 组件无法创建对象
- php - 删除失败,正在将 .\composer.json 还原为其原始内容
- google-bigquery - 在 BigQuery 中创建高级细分
- c++ - 如何限制字符输入范围?
- gmail - 电子邮件标记在 G Suite 的主题行中不显示按钮(它在 Gmail 中有效)
- typescript-typings - 如何更新旧版本的类型