可以在Linux上运行Windows容器吗?该场景基于一个用。net(旧网络)编写的应用程序,Linux用户想要用Docker运行这个应用程序,需要在本地主机上提供一个net462编写的API。
我使用的是测试版的Windows Docker Desktop。
如果不是,那么为什么Windows可以运行Linux容器,反之亦然?
随着时间的推移,这个问题很受欢迎,我想在这里补充一点,解决方法是使用新的。net标准。它允许我将4.6.2框架打包到一个新的库中。
可以在Linux上运行Windows容器吗?该场景基于一个用。net(旧网络)编写的应用程序,Linux用户想要用Docker运行这个应用程序,需要在本地主机上提供一个net462编写的API。
我使用的是测试版的Windows Docker Desktop。
如果不是,那么为什么Windows可以运行Linux容器,反之亦然?
随着时间的推移,这个问题很受欢迎,我想在这里补充一点,解决方法是使用新的。net标准。它允许我将4.6.2框架打包到一个新的库中。
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容器。
有了它,依我看,在生产环境中以这种方式运行它将不是最好的主意。
此外,这个答案提供了更多细节。
不,您不能直接在Linux上运行Windows容器。
但是你可以在Windows上运行Linux。
Windows Server 2016附带了Ubuntu操作系统的基本映像(在2016年9月beta服务包之后)。这就是你可以在Windows上运行Linux的原因。点击这里查看。最后,Linux容器可以通过Docker的LinuxKit在Windows上运行
您可以通过右键单击托盘菜单中的Docker在Linux和Windows操作系统容器之间进行更改。
您可以在虚拟机中使用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 Server和。net Core,也可以在Linux容器中运行。
参见:Microsoft SQL Server by Microsoft | Docker Hub
另外:.NET Core by Microsoft | Docker Hub
对你的问题的直接回答当然是,除非有专门为Linux编译的版本,否则没有。
解决方案1—使用VirtualBox
正如Muhammad Sahputra在这篇文章中所建议的,在Docker容器中运行Windows操作系统是可能的(使用VBoxHeadless -没有图形界面)。
此外,虚拟机网络配置中的NAT设置可以进行端口转发,使您能够传递来自Docker容器的任何流量。从更广泛的角度来看,这最终允许您在Linux机器上运行任何基于windows的服务。
也许这不是Docker容器的典型用例,但它绝对是解决问题的一种有趣的方法。
解决方案2:饮酒
对于简单的应用程序和更复杂的应用程序,您可以尝试在docker容器中使用wine。
这个Docker Hub页面可以帮助你实现你的目标。
我希望Docker能尽快发布一个本地解决方案,就像他们几年前在Windows上做的Docker -machine一样。
容器使用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)
虽然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容器。
什么?为什么?我刚刚在我的“Debian like”主机的VMM上安装了Windows 10 PRO…VMM是一个非常古老的虚拟机管理器…是的,有了它,主机工作得很慢,但虚拟机内部的一切都很好。这是在开发中使用Windows特性的一个很好的选择