
当我与Linux工程师交谈并告诉他们Windows上的Kubernetes集群的问题时,他们非常怀疑地看着我。 有些人甚至不认为
这是合法的 。 Windows上的容器并不像Linux上那样普遍和需求。 但是,我认为值得讨论这个主题,即使只是为了了解Windows和Linux容器之间的一般概念和主要区别。 首先,我将使用宽笔刷在画布上浏览,然后在以后的文章中,我将尝试逐步研究细微差别。
Windows容器
根据
这篇文章:许多.NET或SQL Server开发人员咬了手肘,羡慕了其他Linux工作者。
的确,直到最近,Windows上的容器还是很奇特的。 最糟糕的是,无论是官方的Docker还是Microsoft网站,文档都必须以碎屑的形式收集在每个资源上,所有内容都以概述形式显示,而没有描述“如何和为什么”,并且一两个月后,现有信息就过时了。 而且,这没有什么超自然的东西-与之相关的容器和技术正在以不切实际的速度发展。
目前,该文档使一切变得更好,并涉足Windows容器领域,只需阅读
Microsoft的
官方文档并监视其更改。 有趣的是,该文档使用俄语编写,尽管经过了深入研究,您仍无法避免单击指向各种资源的链接,例如
https://www.docker.com/或
https://kubernetes.io/ ,其中所有内容都是以旧的形式编写的好的英语。
现在,任何问题的答案都可以在官方文档中找到,但是有些细微差别是事先众所周知的。 也许这对您很有用,并且在以Microsoft的名义使用容器技术时可以节省时间。
您不能在Linux和Windows上运行Windows容器*
由于重新配置了应用程序映像,因此容器技术使处理环境变得容易。 就像Apple Appstore或Google Play一样,但仅适用于工程师和开发人员。 与在移动应用程序商店中一样,您无法在iOS上通过Google Play放置应用程序。 因此,在具有Linux操作系统的Docker主机上,您无法使用Windows操作系统启动该容器。 相反,尽管有些“反而是”,但事实也是如此,因为带有Windows的Docker主机仍可以为Linux提供运行容器的环境。
另外,如果不确保操作系统版本兼容,则无法在Windows环境中启动Windows容器。 使用Microsoft的容器时,您将不得不回顾
Windows容器版本兼容性并定期打开此文档。
说到版本控制-随着容器的出现,Microsoft决定发布Windows半年的新半年版本。 这些是Windows Server 1703、1709、1803、1809、1903之类的版本。这些数字表示发行的年份和月份,支持18个月。 前两个已经安息了,服务已经结束。 此外,还有LTS版本,例如Windows Server 2016和Windows Server 2019.
版本列表。因此,如果您在具有Windows 1803版本的主机上收集了该容器,则只能在具有Windows 1803版本的主机上运行该容器。因此,为了不每次都重新构建容器本身,您将不得不使用Windows的LTS版本,该版本具有现代技术开发速度并非总是合理的。 或者,尽管如此,考虑进行版本控制,并按照半年一次的分步计划仍不断地重新组装容器。
Windows容器的Dokerfile中的最新标签并不总是存在,并且通常
不建议使用 。 以一种好方法,您始终需要知道您的Windows版本是什么,并对Dockerfile进行适当的更改。
容器是“基础结构即代码”方法的一部分。 容器需要不断地重新组装,这不仅简单有趣,而且这是使应用程序始终能够在新的改进软件上运行的主要魔力。 但是在我们的情况下,我们面临一个局限性:为所有Windows系统保留通用的Dockerfile不会起作用。 必须考虑到这一点。
以上所有情况对于以进程隔离模式运行的容器都是正确的。 在Hyper-V隔离模式下,向后兼容适用-您可以运行在当前版本和先前版本上构建的所有容器。 通常,使用Hyper-V隔离,还可以在Windows主机上运行Linux容器。 但是到目前为止,这种模式支持的东西更少,这仅仅是缺少Kubernetes。
进程隔离和Hyper-V隔离之间的区别是另一篇文章的主题。 现在,我只是说Hyper-V隔离的方案对我而言并不完全清楚,默认情况下,Windows中使用进程隔离。
另一个令人头疼的问题是在Docker Hub上找到映像的正确版本。 Windows通常缺少某些图像。 例如,您将找不到Nginx,MySQL,Nodejs以及Windows的数百个其他应用程序的正式版本,而您将不得不自己收集容器或使用社区成员收集并提供的容器。
Windows需要花钱。不要忘记Windows仍然是付费的东西。 例如,可以通过Visual Studio订阅或现有Microsoft许可协议中的软件保障获得半年版本。
友情链接但是微软有很多免费的付款方式。 这是BizSpark程序以及Windows Server 2019的各种试用版,为期180天,以此类推。
Windows容器不是轻量级的。人们普遍认为容器是轻量级的,但是Linux的真相并不总是适用于Windows。 乍一看,绝大多数Windows容器的重量都过高。 乍一看,印象没有改变。 例如,一个基本的aspnet:4.8映像重约7.5 GB。

即使将基本映像托管在本地存储库中,将映像初始上载到主机也将花费相当长的时间,更不用说远程存储库(如Docker Hub)了。
是的,您可以在某些情况下使用轻量级的Windows Nano Server,但是,它有很多限制。 甚至更多,如果您正在开发.Net Framework,那么您就不会使用Windows Nano Server。
要进行管理,您需要非常了解CMD和Powershell。您很有可能必须在Docker主机上使用Windows Server的核心版本。 Windows Server具有丰富的远程管理功能。 通常的方法是,使用带有图形界面的Windows Server,您可以将所有图形管理单元连接到任何核心服务器。
尽管容器包含Windows Server的完整版本,但这种方法在容器方案中不起作用。 在Windows容器内,理论上可以通过WMI进行连接,但这并不是那么简单,仅仅是因为主机OS会自行拦截该流量。 主机上可能有数十个和数百个容器,在这种情况下,将流量定向到正确的容器是一件完整的事情。
容器管理和安装Docker的主机都将需要CMD和Powershell。 同样,了解这些外壳对于编写Dockerfile是必需的,因为所有RUN指令都将在上述外壳中执行。
记住所有较长的Powershell cmdlet非常棘手。 这些不是您的简洁bash命令。 尽管现在大多数cmdlet的别名对于任何Linux工程师都是显而易见的。 在powershell中,您可以使用:
rm Remove-Item pwd Get-Location. cat Get-Content touch New-Item etc. # Linux . rm –rf . # Powershell man Get-Help <>
在极其有用的事情中,这就是使用Powershell可以在容器中运行简单的
Web服务器以进行测试。 在Powershell中,所有内容都显示为对象。 如果您是OOP的支持者,那么您将很快体会到此Shell的好处。
作为介绍性文章的结论,我想说的是,我故意没有解决业务流程和集群管理的问题。 Windows上的Docker正在迎头赶上,而Windows上的Swarm和Kubernetes等编排应用程序并未完全实现其功能。
同时,如果您想提升Docker集群,那么它很可能是多平台的。 也就是说,您必须在群集中具有一个或多个Linux主机。 例如,对于Kubernetes,主节点必须在Linux上。 并且在Swarm中,例如,需要Linux容器才能在Nginx上实现平衡器或运行其他仅适用于Linux的流行集群应用程序。
PS在容器中使用Windows只能使用非常有限的脚本集。 但是,这些方案可能会非常有效。 当然,首先想到的是IIS Web应用程序,但是我的经验表明,Windows自包含服务和某些服务(例如MSMQ)在容器中完全隔离。
UPD 本文中有一点点错误;您可以仅在Windows主机上构建Docker集群。 此外,这不仅是Swarm,而且是Micrisoft开发的用于编排Service Fabric集群的产品
UPD2。 Windows 10的Docker容器仅在Hyper-V隔离模式下可用,并且使用Windows Server以外的基本映像。