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

我使用的是测试版的Windows Docker Desktop。

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


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


当前回答

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

其他回答

虽然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供应商锁定价格:无论是金钱还是存储空间。

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

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

Windows Server 2016附带了Ubuntu操作系统的基本映像(在2016年9月beta服务包之后)。这就是你可以在Windows上运行Linux的原因。点击这里查看。最后,Linux容器可以通过Docker的LinuxKit在Windows上运行

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

现在,你可以在Linux上运行SQL Server和。net Core,也可以在Linux容器中运行。

参见:Microsoft SQL Server by Microsoft | Docker Hub

另外:.NET Core by Microsoft | Docker Hub

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

TL; diana:

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

答:不是。他们不能。

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

问:但是Windows的Docker怎么样?或者其他基于虚拟机的解决方案?

答:Docker for Windows允许你模拟在Windows上运行Linux容器,但在底层是创建一个Linux虚拟机,所以Linux容器仍然运行在Linux上,Windows容器运行在Windows上。

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

问:那么,如果我想在容器中运行。net Framework 462应用程序,我该怎么做呢?

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

If it is possible, move to .NET Core. Since .NET Core brings support to most major features of .NET Framework, and .NET Framework 4.8 will be the last version of .NET framework If you cannot migrate to .NET Core - As @Sebastian mentioned - you can convert your libraries to .NET Standard, and have two versions of the application - one on .NET Framework 4.6.2, and one on .NET Core - it is not always obvious. Visual Studio supports it pretty well (with multi-targeting), but some dependencies can require extra care. (Less recommended) In some cases, you can run Windows containers. Windows containers are becoming more and more mature, with better support in platforms like Kubernetes. But to be able to run .NET Framework code, you still need to run on base image of "Server Core", which occupies about 1.4 GB. In same rare cases, you can migrate your code to .NET Core, but still run on Windows Nano server, with an image size of 95 MB.

也让旧的更新成为历史

更新时间:2018年8月8日

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

好处:与问题没有直接关系,但是现在你不仅可以运行Linux容器本身,还可以运行像Kubernetes这样的协调器:Kubernetes现在在Docker桌面稳定频道中可用

2018年更新:

最初的答案通常是正确的,但几个月前,Docker添加了实验性功能LCOW(官方GitHub存储库)。

以下是这篇文章:

Doesn’t Docker for Windows already run Linux containers? That’s right. Docker for Windows can run Linux or Windows containers, with support for Linux containers via a Hyper-V Moby Linux VM (as of Docker for Windows 17.10 this VM is based on LinuxKit). The setup for running Linux containers with LCOW is a lot simpler than the previous architecture where a Hyper-V Linux VM runs a Linux Docker daemon, along with all your containers. With LCOW, the Docker daemon runs as a Windows process (same as when running Docker Windows containers), and every time you start a Linux container Docker launches a minimal Hyper-V hypervisor running a VM with a Linux kernel, runc and the container processes running on top. Because there’s only one Docker daemon, and because that daemon now runs on Windows, it will soon be possible to run Windows and Linux Docker containers side-by-side, in the same networking namespace. This will unlock a lot of exciting development and production scenarios for Docker users on Windows.

原:

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

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

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

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

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

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