我正在使用 Docker Desktop for Windows 的 beta 版本。
如果不行的话,为什么 Windows 可以运行 Linux 容器而反之则不行呢?
作为一道常见问题,随着时间的推移,我希望在这里补充一点,解决方法是使用新的 .NET Standard。它使我能够将
4.6.2
框架打包到一个新库中。4.6.2
框架打包到一个新库中。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容器。不,你不能直接在Linux上运行Windows容器。
但是你可以在Windows上运行Linux。
从Windows Server 2016及以上版本开始,它自带了Ubuntu操作系统的基础镜像(在2016年9月的beta服务包之后)。这就是为什么你可以在Windows上运行Linux而不是反过来。在这里查看更多信息。最终,Docker的LinuxKit使得Linux容器可以在Windows上运行
你可以通过单击托盘菜单中的Docker来在OS容器之间切换,包括Linux和Windows。
正如Muhammad Sahputra在这篇文章中建议的那样,您可以在Docker容器内部运行Windows操作系统(使用VBoxHeadless - 不带图形界面的方式)。
此外,在VM网络配置中设置NAT可进行端口转发,从而使您能够通过Docker容器传递任何进出流量。从广泛的角度来看,这最终允许您在Linux机器上运行任何基于Windows的服务。
也许这不是Docker容器的典型用例,但这绝对是解决问题的有趣方法。
对于简单应用程序甚至较为复杂的应用程序,您可以尝试在Docker容器内部使用wine。
此Docker Hub页面可能会帮助您实现目标。
我希望Docker很快会发布一种本地解决方案,就像几年前在Windows上发布docker-machine一样。
虽然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厂商锁定价格:无论是金钱还是存储空间。
容器使用操作系统内核。Windows容器利用进程来运行。因此理论上讲,Windows容器不能在Linux上运行。
但是有一些解决方法可以使用VM样式的解决方案。
我发现了这个解决方案,它使用Vagrant和Packer在Mac上,所以它也应该适用于Linux: https://github.com/StefanScherer/windows-docker-machine
这个Vagrant环境创建了一个Docker Machine,在你的MacBook上使用Windows容器。你可以轻松地在Docker for Mac Linux容器和Windows容器之间切换。
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)
与虚拟化不同,容器化使用相同的主机操作系统。因此,在Linux上构建的容器无法在Windows上运行,反之亦然。
在Windows中,您必须借助虚拟化(使用Hyper-V)来拥有与容器操作系统相同的操作系统,然后才能运行相同的容器。
Windows的Docker是一个类似的应用程序,它建立在Hyper-V之上,帮助在Windows上运行Linux Docker容器。 但据我所知,没有任何东西可以帮助在Linux上运行Windows容器。
.NET Core
而不是.NET
,这两个是完全不同的环境。 - Slavik Meltser什么?为什么?我刚刚在我的“类Debian”主机上安装了Windows 10 PRO VMM... VMM是一个非常古老的虚拟机管理器... 是的,使用它会使主机机器变慢,但是虚拟机内部一切都很好和快速。这是在开发中使用Windows功能的绝佳选择。