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

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

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


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


当前回答

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

例如,可以使用VirtualBox。只需在系统内部启用Hyper-V→加速→半虚拟化接口。

在那之后,如果Docker因为一个错误而不能启动,在设置中使用“切换到Windows容器…”

其他回答

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

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

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

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

建造无头流浪者盒子 $ git克隆https://github.com/StefanScherer/packer-windows $ CD packers -windows $ packer build——only=vmware-iso windows_2019_docker.json $ vagrant box添加windows_2019_docker 创建Docker机器 $ git克隆https://github.com/StefanScherer/windows-docker-machine $ CD windows-docker-machine $ vagrant up——provider vmware_fusion 2019 切换到Windows容器 (docker-machine env 2019)

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

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

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

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容器。

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

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

解决方案1—使用VirtualBox

正如Muhammad Sahputra在这篇文章中所建议的,在Docker容器中运行Windows操作系统是可能的(使用VBoxHeadless -没有图形界面)。

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

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


解决方案2:饮酒

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

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


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

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

参见:Microsoft SQL Server by Microsoft | Docker Hub

另外:.NET Core by Microsoft | Docker Hub

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