在Linux上运行Windows容器可能吗?该场景基于一个在.net(旧的net)中编写的应用程序和Linux用户,该用户希望使用Docker运行该应用程序,以便在localhost
上提供一个net462
编写的API。
我正在使用Docker Desktop for Windows的测试版
如果不是,那么为什么Windows可以运行Linux容器,反之亦然?
编辑:
由于一段时间过去了,这个问题是一个流行的问题。我想在这里补充一个注意,解决办法是使用新的NetStandard。它允许我将4.6.2
框架打包到新的库中。
容器使用操作系统内核。Windows容器使用进程来运行。所以从理论上讲,Windows容器不能在Linux上运行。
但是,也有利用VMstyle解决方案的变通方法。
我找到了这个在Mac上使用Vagrant和Packer的解决方案,所以它应该也适用于Linux:https://github.com/stefanscherer/windows-docker-machine
这个Vagrant环境创建了一个Docker机器,可以在带有Windows容器的MacBook上工作。您可以轻松地在Docker for Mac Linux容器和Windows容器之间切换。
建造无头流浪箱
$ 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)
不,您不能直接在Linux上运行windows容器。
但您可以在Windows上运行Linux。
Windows Server/10附带了ubuntu OS的基本镜像(2016年9月测试版service pack之后)。这就是您可以在windows上运行linux的原因,而不是在其他方面。看看这里。https://thenewstack.io/finally-linux-containers-really-will-run-windows-linuxkit/
您可以通过右键单击托盘菜单中的docker,在OS容器、Linux和windows之间进行更改。
update3:06.2019有些评论说答案不清楚,我试着澄清一下。
TL;DR:
问:Windows容器可以在Linux上运行吗?
A:不,他们不能。容器使用的是底层操作系统资源和驱动程序,因此Windows容器只能在Windows上运行,Linux容器只能在Linux上运行。
问:但是对于Windows的Docker呢?或者其他基于VM的解决方案?
答:Docker for Windows允许您模拟在Windows上运行Linux容器,但在其背后创建了一个Linux VM,因此Linux容器仍然在Linux上运行,Windows容器也在Windows上运行。
奖励:阅读这篇关于在Windows上运行Linux docker容器的文章。
问:那么,如果我想在容器中运行.NET Framework462应用程序,我应该如何处理它呢?
A:那要看情况。根据几项建议:
>
如果您不能迁移到.NET Core--正如@Sebastian所提到的--您可以将库转换为.NET标准,并拥有两个版本的应用程序--一个在.NET Framework 4.6.2上,一个在.NET Core上--这并不总是显而易见的,Visual Studio对它的支持相当好(具有多目标),但某些依赖项可能需要特别注意。
(不太推荐)在某些情况下,可以运行windows容器。Windows容器越来越成熟,在像Kubernetes这样的平台中有更好的支持。但是要能够运行.NET Framework代码,您仍然需要在“服务器核心”的base映像上运行,该映像占用大约1.4GB。在同样罕见的情况下,您可以将代码迁移到.NET核心,但仍然运行在Windows Nano服务器上,映像大小为95 MB。
同时将旧的更新留作历史记录
update2:08.2018如果您使用的是Docker-for-Windows,那么现在可以同时运行windows和linux容器:https://blogs.msdn.microsoft.com/Premier_developer/2018/04/20/running-docker-windows-and-linux-containers-simulating/
加分:与问题没有直接关系,但您现在不仅可以运行linux容器本身,还可以运行像kubernetes这样的orchestrator:https://blog.docker.com/2018/07/kubernetes-is-now-available-in-docker-desktop-stable-channel/
2018年更新:
最初的回答总的来说是对的,但几个月前,docker添加了实验性功能LCOW(官方github存储库)。
从这篇文章:
Docker for Windows不是已经运行Linux容器了吗?没错。Docker for Windows可以运行Linux或Windows容器,并通过Hyper-V Moby Linux VM支持Linux容器(从Docker for Windows 17.10开始,该VM基于LinuxKit)。
使用LCOW运行Linux容器的设置要比以前的体系结构简单得多,Hyper-V Linux VM运行Linux Docker守护进程以及所有容器。使用LCOW,Docker守护进程作为Windows进程运行(与运行Docker Windows容器时相同),并且每次启动Linux容器时,Docker都会启动一个最小的Hyper-V管理程序,该管理程序运行一个带有Linux内核的VM,runc和在其上运行的容器进程。
因为只有一个Docker守护进程,而且该守护进程现在运行在Windows上,所以不久就可以在同一个网络命名空间中并排运行Windows和Linux Docker容器。这将为Docker用户在Windows上解锁大量激动人心的开发和生产场景。
原件:
正如@panagiotiskanavos的评论中提到的,容器不是为了虚拟化,它们正在使用主机的资源。因此,目前windows容器不能在linux机器上“按原样”运行。
但是--您可以通过使用VM来做到这一点--因为它在Windows上工作。您可以在linux主机上安装windows VM,这将允许运行windows容器。
有了它,在PROD环境中以这种方式运行它将不是最好的主意。
此外,这个答案提供了更多的细节。
问题内容: 是否可以在 Linux* 上运行 Windows容器 ?该方案基于一个用 .NET (旧网络)编写的应用程序,并且 Linux用户 希望通过Docker运行此应用程序以在上提供书面API 。 * 我正在使用Windows的Docker桌面的 beta版本 如果不是,那为什么Windows可以运行Linux容器而不是相反? 编辑: 随着时间的流逝,这个问题很受欢迎。我想在此处添加一条注释
问题内容: 通常在绑定端口时,我会这样做,但是我可以在我的内部指定端口绑定吗? 我正在启动一个监听端口的服务器。服务器通过cmd行参数获取端口。如果我不必在两个位置(在command和中)重复端口,那将是很棒的 问题答案: 在您只能使用。该指令通知Docker容器在运行时监听指定的网络端口。EXPOSE不会使主机可以访问容器的端口。 要将Hostport分配给容器,您需要执行()。或发布 所有 公
所以我把这个oracle数据库托管在Linux服务器上。我知道如何从windows机器上使用putty访问它,但我需要从windows机器上使用JDBC访问它。我有数据库的主机名、端口、服务名、用户名和密码。我不知道如何打开连接。我试过这样: 但我无法接通请帮帮忙 编辑: 好的,我意识到地址是错误的,所以我把它改为:Connection con=DriverManager.getConnectio
我使用Win 10 Pro N(版本1709)作为开发机器,使用Windows Server 2016 Standard(版本1607)作为生产服务器。 我目前正在开发一个使用MongoDb作为数据库的ASP.NET Core2应用程序。 几天前,我第一次偶然发现了这个想法,将MongoDb作为Docker映像运行。 这是个好决定吗?或者在我的场景中我应该使用Linux容器而不是Windows容器
问题内容: 我知道可以通过Github页面托管基于Jekyl的静态站点/博客。 可以对基于AngularJS的静态网站/博客做同样的事情吗? 问题答案: 考虑到所有的角度UI github页面实际上都是带有演示的角度应用程序,我会说是的: http://angular-ui.github.io/ http://angular-ui.github.io/bootstrap/ 等等
了解如何配置WAS或OpenJPA,以便通过容器管理的实体管理器使用容器管理的身份验证。 试图通过在JNDI中注册为“JDBC/DB2”(指Oracle)的JDBC数据源访问Oracle数据库,该数据源在persistence.xml中定义。 persistence.xml 但是,当访问持久性单元的容器管理实体管理器时,会抛出ORA-01017无效的usrname/password。如果在pers