Windows容器可以在Linux上托管吗?

405
有没有可能在 Linux 上运行 Windows 容器?场景基于一个使用 .NET(旧版)编写的应用程序和想要在 Docker 上运行此程序的 Linux 用户,需要在本地主机上提供一个 net462 编写的 API。
我正在使用 Docker Desktop for Windows 的 beta 版本。
如果不行的话,为什么 Windows 可以运行 Linux 容器而反之则不行呢?
作为一道常见问题,随着时间的推移,我希望在这里补充一点,解决方法是使用新的 .NET Standard。它使我能够将 4.6.2 框架打包到一个新库中。

4
要构建和运行Windows容器,需要具备容器支持的Windows系统。 - ajtrichards
7
为什么Windows可以运行Linux容器,而反过来就不行呢?暂时没有这样的功能吗? - Sebastian 506563
19
因为Docker在后台运行VirtualBox虚拟化技术,让Linux容器可以在Windows上运行。理论上来说,我猜也可能反过来实现,只是Docker没有这样做。 - Gregory Suvalian
5
使用虚拟机技术,每个虚拟机都有自己的操作系统。使用容器技术,则有一个基础操作系统映像,并且每个容器在该基础上添加了一个薄层。Docker中使用的基础操作系统是基于Linux的,也就是说,Windows容器无法使用这个基础操作系统,因为它们不同。 - elha2en
3
@PanagiotisKanavos 请回复。 - Sebastian 506563
显示剩余12条评论
10个回答

320

TL;DR:

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

A:不可以。

容器使用底层操作系统资源和驱动程序,因此Windows容器只能在Windows上运行,Linux容器只能在Linux上运行。

Q:那么Docker for Windows呢?或者其他基于虚拟机的解决方案呢?

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

附加信息:阅读这篇非常好的文章,了解如何在Windows上运行Linux Docker容器。

Q:那么,如果我想要在容器中运行一个.NET Framework 462应用程序,该怎么办?

A:这取决于情况。请考虑以下建议:

  • 如果可能的话,迁移到.NET Core。由于.NET Core支持.NET Framework的大多数主要功能,且.NET Framework 4.8将是最后一个版本。

  • 如果无法迁移到.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 容器 {{link1}}

额外信息:虽然与问题不直接相关,但现在您不仅可以运行 Linux 容器本身,还可以运行像 Kubernetes 这样的编排器:{{link2}}

更新于 2018 年:

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

来自此帖子

Docker for Windows已经可以运行Linux容器了,没错。 Docker for Windows可以运行Linux或Windows容器,并通过Hyper-V Moby Linux VM(从Docker for Windows 17.10开始,该VM基于LinuxKit)支持Linux容器。
使用LCOW运行Linux容器的设置比以前的架构要简单得多。以前的架构中,一个Hyper-V Linux VM运行Linux Docker守护程序和所有容器。而使用LCOW时,Docker守护程序作为一个Windows进程运行(与运行Docker Windows容器时相同),每次启动Linux容器时,Docker会启动一个最小化的Hyper-V hypervisor,其中运行着一个带有Linux内核、runc和容器进程的虚拟机。
由于只有一个Docker守护程序,并且该守护程序现在运行在Windows上,很快就可以在相同的网络命名空间中同时运行Windows和Linux Docker容器。这将为Windows上的Docker用户提供许多令人兴奋的开发和生产场景。
正如@PanagiotisKanavos在评论中提到的,容器并不用于虚拟化,并且它们正在使用主机机器的资源。因此,目前无法在Linux机器上直接运行Windows容器。
但是 - 你可以通过使用虚拟机来实现,因为它在Windows上有效。你可以在Linux主机上安装一个Windows虚拟机,从而可以运行Windows容器。
在我看来,在生产环境中以这种方式运行可能不是最好的选择。
此外,这个答案提供了更多细节。

15
这个链接提供的内容实际上并没有详细介绍这一点,它只是解释了如何在Windows上运行Linux容器(相反的情况)。虽然在Windows虚拟机中运行Docker是可能的,但你需要支持嵌套虚拟化。这意味着它可以在VMware上工作,但不能在Virtualbox上工作。 - Ralf
7
回答中有很多文字,但似乎没有回答这个问题。 - Kyberias
4
这不是问题的答案。它不应该被排名这么高。 - Amorphous
3
这不是对这个问题的答案。在Linux上运行Docker与在Windows上运行Docker有明显的区别。为什么将其标记为答案? - Ani
1
似乎现在可以将Microsoft Windows作为基于Docker的容器运行 - 请参见Windows base os images。根据页面的说明,这些容器必须在Windows主机上运行,但它们看起来是Docker镜像。 - Will
显示剩余3条评论

34

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

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

从Windows Server 2016及以上版本开始,它自带了Ubuntu操作系统的基础镜像(在2016年9月的beta服务包之后)。这就是为什么你可以在Windows上运行Linux而不是反过来。在这里查看更多信息。最终,Docker的LinuxKit使得Linux容器可以在Windows上运行

你可以通过单击托盘菜单中的Docker来在OS容器之间切换,包括Linux和Windows。

Enter image description here

Enter image description here


42
楼主希望在Linux服务器上运行Windows容器,因此这个回答并未解答问题。但我不喜欢那些没有留言就给出负评的人,所以我会给予赞成票。 - daisy
6
因为这不是问题的答案。 - Stefan Steiger
我不确定之前说了什么,但第一句话说你不能,第二句话说你可以。可能是缺失或者某些东西让人感到困惑。 - StingyJack

24

方案一 - 使用VirtualBox

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

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

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


方案二 - 使用Wine

对于简单应用程序甚至较为复杂的应用程序,您可以尝试在Docker容器内部使用wine

此Docker Hub页面可能会帮助您实现目标。


我希望Docker很快会发布一种本地解决方案,就像几年前在Windows上发布docker-machine一样。


24

虽然Docker for Windows可以完美地运行Linux容器,但反之则不可行,因为实际原因尚未实现。

其中一个最明显的原因是,虽然Docker for Windows可以自由地运行Linux VM,但如果要在Docker for Linux中运行它,则需要Windows许可证。

此外,Linux是完全可定制的,因此Docker for Windows使用的Linux VM已被剥离到只有几MB,仅包含运行容器所需的最低限度,而最小的Windows发行版大约为1.5 GB。虽然这可能不是一个不切实际的大小,但比起Windows上的Linux版本,它更加笨重。

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


17

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

但是有一些解决方法可以使用VM样式的解决方案。

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

这个Vagrant环境创建了一个Docker Machine,在你的MacBook上使用Windows容器。你可以轻松地在Docker for Mac Linux容器和Windows容器之间切换。

Running bash commands

Enter image description here

building the headless Vagrant box

$ 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

Create the Docker Machine

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

Switch to Windows containers

$ eval $(docker-machine env 2019)

13

与虚拟化不同,容器化使用相同的主机操作系统。因此,在Linux上构建的容器无法在Windows上运行,反之亦然。

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

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


7
您可以在虚拟机中使用 Windows 容器(客户操作系统应符合要求 - Windows 10 Pro 或 Windows Server 2016)。
例如,您可以使用 VirtualBox。只需在 SystemAccelerationParavirtualization Interface 中启用 Hyper-V
之后,如果 Docker 因错误而无法启动,请在设置中使用“切换到 Windows 容器...”。

3
我们可以在Windows上运行Linux容器。Docker for Windows使用基于Hyper-V的Linux-Kit或WSL 2作为后端来方便Linux容器。
如果任何Linux发行版都有这种设置,我们可以运行Windows容器。Docker for Linux仅支持Linux容器。

2

4
这是正确的 - 但与问题无关。此外,MS-SQL不仅仅是引擎(在Linux上没有filestream或R,因此它甚至不是整个引擎)。 - Stefan Steiger
你必须要提前思考一步……他为什么会问呢?如果他是因为想运行其中之一而问的话:看这里。 - dagelf
2
可能。但在我看来,他可能是因为已经这样做了,现在必须在Linux上运行像SSRS/SSAS或一些Web表单控件(如ReportViewer)之类的东西。 - Stefan Steiger
Docker镜像microsoft/dotnet是为.Net Core设计的,这与旧的.Net 4.x完全不同,因此您无法在.Net Core上运行为旧的.Net设计的应用程序。 - j123b567
3
他们正在支持.NET Core不是.NET,这两个是完全不同的环境。 - Slavik Meltser

-3

什么?为什么?我刚刚在我的“类Debian”主机上安装了Windows 10 PRO VMM... VMM是一个非常古老的虚拟机管理器... 是的,使用它会使主机机器变慢,但是虚拟机内部一切都很好和快速。这是在开发中使用Windows功能的绝佳选择。


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