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

可以在Linux上运行Windows容器吗?该场景基于一个用net(旧网络)编写的应用程序,而想要用Docker运行这个应用程序的Linux用户需要在localhost上提供一个net462编写的API。

我正在使用Docker Desktop for Windows的测试版。

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


由于一段时间过去了,这个问题很受欢迎,我想在这里补充一点,解决方法是使用新的net标准。它允许我将4.6.2框架打包到一个新的库中。

286027 次浏览

TL;博士:

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

答: 不。他们不能。

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

但是Windows的Docker呢?或者其他基于虚拟机的解决方案?

答: Docker for Windows允许你模拟在< >强Windows < / >强上运行Linux <强> < / >强容器,但在底层创建的是Linux虚拟机,所以仍然是Linux容器运行在Linux上,Windows容器运行在Windows上

奖励:阅读这篇很棒的文章关于在Windows上运行Linux docker容器的内容。

那么,如果我想在容器中运行,我应该用.NET Framework 462应用程序做什么?

答:这要看情况。考虑以下建议:

  • 如果可能,移动到。net Core。由于.NET Core支持.NET Framework的大多数主要特性,以及.NET Framework 4.8 会是。net框架的最后一个版本吗

  • 如果你不能迁移到。net Core——正如@Sebastian提到的——你可以将你的库转换为net标准,并且有两个版本的应用程序——一个在。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容器同时: . href="https://blogs.msdn.microsoft.com/premier_developer/2018/04/20/running-docker-windows-and-linux-containers-simultaneously/" rel="noreferrer">同时运行Docker Windows和Linux容器 . href="https://blogs.msdn.microsoft.com/premier_developer/2018/04/20/running-docker-windows-and-linux-containers-simultaneously/" rel="noreferrer">

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

2018年更新:

最初的答案一般是正确的,几个月前,Docker添加了实验特征LCOW (官方GitHub仓库)。

这篇文章:

Docker for Windows不是已经运行Linux容器了吗?这是正确的。 Docker for Windows可以运行Linux或Windows容器,有支持 为Linux容器通过Hyper-V Moby Linux虚拟机(作为Docker for Windows 17.10此虚拟机基于LinuxKit) 使用LCOW运行Linux容器的设置要简单得多 之前的架构,其中Hyper-V Linux虚拟机运行Linux Docker Daemon,以及您的所有容器。使用Docker守护进程LCOW 作为Windows进程运行(与运行Docker Windows时相同) 容器),以及每次启动Linux容器Docker时 启动一个最小的Hyper-V管理程序,运行Linux虚拟机 内核、runc和运行在上面的容器进程

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

<强>原始:< / >强

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

-你可以使用VM -因为它在Windows上工作。您可以在Linux主机上安装Windows虚拟机,这将允许运行Windows容器。

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

此外,这个答案提供了更多细节。

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

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

Windows Server 2016附带Ubuntu操作系统的基本映像(在2016年9月的测试服务包之后)。这就是你可以在Windows上运行Linux的原因。点击这里查看。< a href = " https://thenewstack。/a> . Linux容器可以在Windows上运行

您可以通过右键单击托盘菜单中的Docker在Linux和Windows操作系统容器之间进行更改。

Enter image description here

Enter image description here

你可以在虚拟机中使用Windows容器(客户操作系统应该匹配要求- Windows 10 Pro或Windows Server 2016)。

例如,你可以使用VirtualBox。只要在系统加速度半虚拟化接口中启用hyper - v即可。

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

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

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

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

现在你可以在Linux上运行SQL Servernet核心,因此也可以在Linux容器中运行。

看:Microsoft SQL Server by Microsoft | Docker Hub

另外:。Docker Hub . NET Core

对你的问题的直接回答当然是,除非有专门为Linux编译的版本,否则没有。

解决方案1 -使用VirtualBox

正如默罕默德Sahputra这篇文章中建议的那样,在集装箱码头工人中运行Windows操作系统是可能的(使用VBoxHeadless -没有图形界面)。

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

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


解决方案2 -使用

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

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


我希望Docker能尽快发布一个本地解决方案,就像他们几年前在Windows上做的Docker -machine一样。

容器使用OS内核。Windows容器利用进程来运行。所以从理论上讲,Windows容器不能在Linux上运行。

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

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

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

Running bash commands

Enter image description here

建造无头流浪者盒子

$ 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)

虽然Windows的Docker完全能够运行Linux容器,但相反,尽管理论上是可能的,但由于实际原因无法实现。

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

而且,Linux是完全可定制的,因此Docker for Windows所使用的Linux虚拟机被精简到只有几MB,只包含运行容器所需的最小值,而可用的最小Windows发行版约为1.5 GB。它可能不是一个不切实际的大小,但它比Windows上的Linux版本要麻烦得多。

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

我们可以在Windows上运行Linux容器。Docker for Windows使用基于hyper - v的Linux- kit或WSL 2作为后端来方便Linux容器。

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

什么?为什么?我刚刚在VMM上安装了Windows 10 PRO在我的“Debian like”上;宿主VMM是一个非常古老的虚拟机管理器…是的,有了它,主机工作得很慢,但虚拟机内部的一切都很好。这是在开发中使用Windows特性的一个很好的选择