334

是否可以在 Linux 上运行 Windows 容器?该场景基于使用.NET(旧网络)编写的应用程序,以及希望使用 Docker 运行此应用程序以在 .NET 上提供书面 API的Linux 用户net462localhost

我正在使用Docker Desktop for Windows 的beta 版本。

如果不是,那为什么 Windows 可以运行 Linux 容器而不是反之呢?


随着时间的流逝,这个问题很受欢迎。我想在这里补充一点,解决方法是使用新的网络标准。它允许我将4.6.2框架打包到新库中。

4

9 回答 9

250

TL;博士:

问: Windows 容器可以在 Linux 上运行吗?

答: 不,他们不能。

容器使用的是底层操作系统资源和驱动,所以 Windows 容器只能在 Windows 上运行,Linux 容器只能在 Linux 上运行。

问:但是 Docker for Windows 呢?还是其他基于 VM 的解决方案?

答: Docker for Windows 允许您模拟在Windows上运行的Linux容器,但在底层创建了一个 Linux VM,因此Linux 容器仍然在 Linux 上运行,而 Windows 容器在 Windows 上运行

奖励:阅读这篇关于在 Windows 上运行 Linux docker 容器的非常好的文章。

问:那么,如果我想在容器中运行,我应该如何处理 .NET Framework 462 应用程序?

答:这取决于。以下几点建议:

  • 如果可能的话 - 迁移到 .NET Core。由于 .NET Core 带来了对 .NET Framework 大部分主要功能的支持,而 .NET Framework 4.8将是 .NET Framework 的最后一个版本

  • 如果您无法迁移到 .NET Core - 正如@Sebastian 所提到的 - 您可以将您的库转换为.NET Standard,并拥有两个版本的应用程序 - 一个在 .NET Framework 4.6.2 上,一个在 .NET Core 上 - 它是并不总是很明显。Visual Studio 很好地支持它(具有多目标),但某些依赖项可能需要格外小心。

  • (不太推荐)在某些情况下,您可以运行 Windows 容器。Windows 容器越来越成熟,在Kubernetes等平台上得到了更好的支持。但为了能够运行 .NET Framework 代码,您仍然需要在“Server Core”的基础镜像上运行,该镜像占用大约 1.4 GB。在同样罕见的情况下,您可以将代码迁移到 .NET Core,但仍可在Windows Nano 服务器上运行,图像大小为 95 MB。

也留下历史的旧更新

更新 2: 08.2018

如果您正在使用 Docker-for-Windows,您现在可以同时运行 Windows 和 Linux 容器:同时运行 Docker Windows 和 Linux 容器

奖励:与问题没有直接关系,但您现在不仅可以运行 Linux 容器本身,还可以运行像 Kubernetes 这样的编排器:Kubernetes 现在在 Docker 桌面稳定频道中可用

2018 年更新:

原始答案总体上是正确的,但是几个月前,docker 添加了实验功能 LCOW官方 GitHub 存储库)。

这篇文章

Docker for Windows 不是已经运行 Linux 容器了吗?这是正确的。Docker for Windows 可以运行 Linux 或 Windows 容器,通过 Hyper-V Moby Linux VM 支持 Linux 容器(从 Docker for Windows 17.10 开始,此 VM 基于 LinuxKit)。

使用 LCOW 运行 Linux 容器的设置比以前的体系结构简单得多,之前的体系结构Hyper-V Linux VM 运行 Linux Docker 守护程序以及所有容器。使用 LCOW,Docker 守护进程作为 Windows 进程运行(与运行 Docker Windows 容器时相同),每次启动 Linux 容器时,Docker 都会启动一个最小的 Hyper-V 虚拟机管理程序,运行具有 Linux 内核、runc 和容器进程的 VM在上面运行。

因为只有一个 Docker 守护程序,而且该守护程序现在在 Windows 上运行,所以很快就可以在同一个网络命名空间中并排运行 Windows 和 Linux Docker 容器。这将为 Windows 上的 Docker 用户解锁许多令人兴奋的开发和生产场景。

原来的:

正如@PanagiotisKanavos 在评论中提到的,容器不是用于虚拟化的,它们正在使用主机的资源。因此,目前 Windows 容器无法在 Linux 机器上“按原样”运行。

但是- 你可以通过使用 VM 来做到这一点 - 因为它适用于 Windows。您可以在 Linux 主机上安装 Windows VM,这将允许运行 Windows 容器。

有了它,恕我直言,在生产环境中以这种方式运行它并不是最好的主意。

此外,此答案提供了更多详细信息。

于 2017-02-12T07:36:45.830 回答
30

不,您不能直接在 Linux 上运行 Windows 容器。

但是你可以在 Windows 上运行 Linux。

Windows Server 2016 随附 Ubuntu 操作系统的基本映像(在 2016 年 9 月的 beta 服务包之后)。这就是您可以在 Windows 上运行 Linux 而不是其他方式的原因。看看这里。最后,Linux 容器可以使用 Docker 的 LinuxKit 在 Windows 上运行

您可以通过右键单击托盘菜单中的 Docker 在 OS 容器 Linux 和 Windows 之间进行切换。

在此处输入图像描述

在此处输入图像描述

于 2017-08-20T00:09:48.150 回答
16

容器使用操作系统内核。Windows 容器利用进程来运行。所以理论上来说,Windows 容器不能在 Linux 上运行。

但是,有一些使用 VMstyle 解决方案的变通方法。

找到了这个在 Mac 上使用VagrantPacker的解决方案,所以它也应该适用于 Linux: https ://github.com/StefanScherer/windows-docker-machine

这个 Vagrant 环境创建了一个 Docker 机器,可以在带有 Windows 容器的 MacBook 上工作。您可以在 Docker for Mac Linux 容器和 Windows 容器之间轻松切换。

运行 bash 命令

在此处输入图像描述

构建无头流浪者盒子

$ git clone https://github.com/StefanScherer/packer-windows
$ cd packer-windows

$ packer build --only=vmware-iso windows_2019_docker.json
$ vagrant box add windows_2019_docker windows_2019_docker_vmware.box

创建 Docker 机器

$ git clone https://github.com/StefanScherer/windows-docker-machine
$ cd windows-docker-machine
$ vagrant up --provider vmware_fusion 2019

切换到 Windows 容器

$ eval $(docker-machine env 2019)
于 2019-04-01T11:47:35.593 回答
15

解决方案 1 - 使用VirtualBox

正如Muhammad Sahputra这篇文章中所建议的那样,可以在Docker 容器内的VirtualBox内运行Windows 操作系统(使用 VBoxHeadless - 无图形界面)。

此外,VM 网络配置中的 NAT 设置可以进行端口转发,这使您能够传递进出 Docker 容器的任何流量。从广义上讲,这最终允许您在 Linux 机器上运行任何基于 Windows 的服务。

也许这不是 Docker 容器的典型用例,但它绝对是解决问题的一种有趣方法。


解决方案 2 - 使用Wine

对于简单的应用程序,可能更复杂,您可以尝试在 docker 容器中使用wine

这个 Docker Hub 页面可以帮助你实现你的目标。


我希望 Docker 能尽快发布原生解决方案,就像几年前他们在 Windows 上使用 docker-machine 所做的那样。

于 2019-01-10T19:03:46.730 回答
15

虽然 Docker for Windows 完全能够运行 Linux 容器,但反过来,虽然理论上可行,但由于实际原因并未实现。

最明显的一点是,虽然 Docker for Windows 可以自由运行 Linux VM,但 Docker for Linux 需要 Windows 许可证才能在 VM 中运行。

此外,Linux 是完全可定制的,因此 Docker for Windows 使用的 Linux VM 已精简到只有几 MB,仅包含运行容器所需的最低限度,而可用的最小 Windows 发行版约为 1.5 GB。它可能不是一个不切实际的大小,但它比 Windows 上的 Linux 对应物要麻烦得多。

虽然有人当然可以出售捆绑了 Windows 许可证并准备在 Linux 下运行 Windows 容器的 Docker for Linux 变体(我不知道是否存在这样的产品),但底线是你无法避免支付 Windows 供应商锁定价格:金钱和存储空间。

于 2019-05-08T12:57:13.863 回答
11

虚拟化不同,容器化使用相同的主机操作系统。所以在 Linux 上构建的容器不能在 Windows 上运行,反之亦然。

在 Windows 中,您必须借助虚拟化(使用Hyper-V)才能拥有与容器操作系统相同的操作系统,然后您应该能够运行相同的操作系统。

Docker for Windows 是一个类似的应用程序,它基于 Hyper-V 构建,有助于在 Windows 上运行 Linux Docker 容器。但据我所知,没有任何东西可以帮助在 Linux 上运行 Windows 容器。

于 2018-05-30T12:36:56.067 回答
7

您可以在虚拟机中使用 Windows 容器(来宾操作系统应符合要求 - Windows 10 Pro 或Windows Server 2016)。

例如,您可以使用VirtualBox。只需在SystemAccelerationParavirtualization Interface中启用Hyper-V

之后,如果 Docker 因错误而无法启动,请在设置中使用“切换到 Windows 容器...”。

于 2018-01-10T15:51:47.827 回答
2

我们可以在 Windows 上运行 Linux 容器。Docker for Windows 使用基于Hyper-V的 Linux-Kit 或WSL 2作为后端来促进 Linux 容器。

如果任何 Linux 发行版都有这种设置,我们可以运行 Windows 容器。Docker for Linux 仅支持 Linux 容器。

于 2020-09-25T17:50:23.930 回答
1

现在,您可以在 Linux 上运行SQL Server.NET Core,因此也可以在 Linux 容器中运行。

请参阅:Microsoft 的 Microsoft SQL Server | 码头工人中心

另外:Microsoft 的 .NET Core | 码头工人中心

您的问题的直接答案当然是,除非有专门为 Linux 编译的版本,否则不会。

于 2018-06-26T23:31:37.530 回答