Windows Container 和 Docker

时间:2021-12-04 07:16:52

标签:

Windows Container 和 Docker

微软在2016年的Ignite技术大会上正式发布了Windows Server 2016,其中的容器服务已经可以作为生产环境使用。这意味着Windows 内置的容器服务正式进入了大家的视野,虽然之前我们已经有了Docker for Windows,但是在这篇文章中我们要聊的并不是运行在Windows上面的Linux虚拟机里面的容器,而是原生的Windows容器。

1. Windows Container提供2种运行时:Window Server Contianer 或者 Hyper-V Container

Windows 提供2种类型的容器运行时模型。其中,Windows Server Container 与大家所熟悉的Linux Contianer容器模型一致,容器与底层操作系统共享内核,所以它们会很轻量而且运行迅速。当你在容器中启动一个进程的时候,这个进程实际上运行在宿主机上,你可以使用任务管理器或者Powershell 命令 Get-Process 获取到这个进程的信息。

Hyper-V Contianer则是一种全新的容器运行时模型,它将在宿主机上启动一个很小的虚拟机,所以容器将具备自己独立的操作系统内核。当你在Hyper-V Container中启动进程的时候,宿主机对这个进程是无感知的。Hyper-V Container提供了更好的隔离性,而且这个虚拟机被裁减得非常小,所以性能仍然会不错。在Windows Server 2016上,你可以在2种不同的运行时之间选择;而Windows 10上虽然也提供了容器服务,但是只能运行Hyper-V Contianer。

无论是哪种运行时,你都可以使用标准的Docker命令行进行操作,同时容器镜像的格式也和Linux容器镜像保持一致。这意味着Windows Container 可以通过 docker hub 分发,你之前在Linux容器上的经验积累也可以被继承到Windows容器上。

2. Windows Container 只能运行 Windows应用程序(至少现在是这样)

很多朋友都问过这个问题:我是不是可以在Windows容器服务中运行Linux应用,或者反过来。Docker很厉害,但还木有辣么厉害。你无法在Windows上直接运行Linux进程,同样你也无法在Windows Container中运行Linux进程。这个情况对于以上提到的2中运行时都适用,无论哪种运行时模型,底层操作系统都是Windows,所以你无法运行Linux进程。

这同样意味着,当前Docker Hub上面的大量镜像无法在Windows Container 中使用。微软已经开始在Docker Hub上提供Windows容器镜像,你可以使用同样的docker pull命令或者去这些镜像。比如:microsoft/windowservercore 镜像是一个完整的服务器镜像(大概3G大小),在这个镜像中你可以使用标准的msi安装包,通过Dockerfile来构建你自己镜像,可以安装和运行完整的.net framework和其他的Windows应用程序。microsoft/nanoserver 镜像则是一个精简版的操作系统镜像(大概300M),不提供msi支持,只能运行.net core应用,同时需要使用powershell进行管理。

虽然微软在过去的几年中变得越来越开放,但是Windows和Linux仍然是2个完全不同的操作系统,我们看到了bash for windows,也看到 powershell on linux,,但其中的界限仍然存在。具微软在Ignite大会上提供的信息,未来也许可以通过Hyper-V Container提供在Windows上运行Linux Container的支持,但是现在暂时还做不到。

3. 容器编排平台已经可以支持混合部署Windows和Linux服务器节点

Swarm是Docker提供的容器编排平台,从1.12版本开始,任何的服务器节点都可以加入Swarm集群,这同样适用于Windows服务器。因此,你可以在一个Swarm集群中混合部署Windows和Linux节点,虽然不同的操作系统节点上只能运行对应的容器,但是它们都可以通过swarm network进行通讯,构建一个完整的应用。

对于微服务拆分来说,可以构建跨平台的分布式应用非常具有吸引力。如果你的应用现在是一个传统的asp.net单体应用,你可以先采用microsoft/windowservercore镜像对整个单体应用进行容器化部署,然后逐步的将其中的某些组件进行拆分,使用microsoft/nanoserver上的.net core来运行这些微服务组件,你甚至可以引入nginx作为你的反向代理服务器,并将其运行在linux服务器节点上。

混合的Docker Swarm集群为你提供了更佳的微服务拆分路径,并在拆分过程中提供了更灵活的跨平台选择,这对于任何的团队都非常具有吸引力。

4. Windows Container的授权方式将跟随所运行的操作系统而定

如果你到Docker Hub上查看微软的windows server core和nano server容器镜像,你会注意到说明中都带有授权说明(EULA)。按照其中的说明,容器将随所运行的操作系统授权,也就是说根据你使用服务器版本而定,如:DataCenter或者Standard版本。

上图是我在微软官方的Windows Server 2016授权白皮书上找到的,根据这个说明,你可以在DataCenter上运行无限个Hyper-V Container,而在Standard版本上运行2个;而对于原生的Windows Server Container 则都是无限。