微软发布Windows Server 2016的最新预览版,Docker首次亮相

Windows Server上首次出现Docker的身影

本周早些时候,负责微软Azure业务的CTO Mark Russinovich在Azure博客上发表了一篇文章 “Docker、Windows and Trends”。在文章中,Mark简要地回顾了容器技术的概念以及容器与虚拟机相比的巨大优势、Docker的发展、新版本Windows Server对容器的支持、如何使用编排工具,以及Azure Service Fabric服务对微服务架构的支持等等。

这篇文章刚一发布,就有读者 猜测它很可能是为即将发布的Windows Server 2016的第3个技术预览版进行“预热”。果不其然,仅仅两天之后,“红衣教主”Scott Gu就 宣布Windows Server 2016最新版本的发布,新版本中不出意料地加入了对Docker技术的支持,即Windows Server Containers的第1个预览版本。

微软近年来与Docker的密切合作可谓有目共睹,坊间还一度流出 微软将收购Docker的传闻。在去年六月的首届DockerCon大会上,微软就展示了如何在Azure中创建与维护Docker的体验。但直至目前为止,Azure上的Docker主机仅能够运行在Linux虚拟机上。在Azure上运行Linux,额……听起来总是有点古怪。不过就在去年十一月,微软宣布了在Windows Server上实现容器技术的计划,承诺为Windows开发者带来与Linux平台上相同的Docker应用体验。如今,随着Windows Server 2016新版本的发布,Windows开发者终于也能够体会到Docker这一利器对于开发以及部署所带来的巨大好处了。

作为对微软发布Windows Server Containers的响应,Docker也在其技术 博客中表示将在Docker Engine中提供对Windows平台的支持,并推出了一个针对Windows的Docker Engine的预览版。而早在今年四月,Docker就推出了一个Windows版本的Docker客户端工具。对于已经熟悉在Linux平台上使用Docker的开发者与运维人员来说,可以将他们的经验无缝地带到Windows平台上。


三种部署方式

随着新版本Windows Server 2016的发布,微软也很快地为Visual Studio推出了一项支持Docker部署的 工具,其实在今年的DockerCon大会上,Mark就在第2天的主题演讲中为听众演示了如何使用Visual Studio进行部署的体验。熟悉Visual Studio的开发者应该可以很快地上手,通过它可以自动在Azure平台上创建与配置容器主机,随后创建一个包含应用程序的容器镜像,并发布到容器主机中。所有这一切操作都可以直接在IDE中完成,不过这一工具目前只支持最新的Visual Studio 2015版本。

此外,开发者也可以选择直接在Azure Marketplace中部署一台已预先配置了容器特性,并且安装了Docker Engine的Windows Server 2016虚拟机,可以参考一下这个 快速教程与视频。当容器主机启动之后,就可以按照教程中介绍的步骤,通过Docker及PowerShell创建和管理容器。

除了在Azure中部署容器之外,开发者也能够在本机以通过 Hyper-V创建虚拟机的方式作为容器的主机,为了简化配置过程,微软在GitHub上提交了一些 PowerShell脚本,使配置过程尽量实现自动化。


两种类型的容器

在Windows Server 2016中,微软预计将提供两种类型的容器,即此次发布的Windows Server Containers及即将在不久之后的预览版本中出现的Hyper-V Containers。这两种类型的窗口可以使用相同的Docker API与客户端进行部署,并且Windows容器包可以运行在任何一种容器中,因为它们所使用的Windows内核功能是相同的。而由于Linux容器的实现依赖于主机内核的Linux API功能,因此无法在Windows Server主机上运行Linux容器,反之亦然。但可以通过使用相同的Docker客户端管理这些不同平台的容器。

那么这两种容器的差别何在呢?Windows Server Containers会在主机与多个容器之间共享操作系统,由于它们共享了大量的数据与API,应用程序就有可能在有意或无意之间脱离运行中容器的束缚,或是造成主机与其它容器的拒绝服务。因此这种类型的容器比较适用于运行可信应用程序的场景,这种信任包括操作系统与应用程序,以及多个应用程序之间。也就是说,主机操作系统与应用程序处于同一个可信边界之内。如果所部署的应用属于多容器应用、或是组成一个大型应用的一部分、以及来自同一个组合的应用,那么就可以选择这种容器。

与之相对的是,在某些情况下,你希望在同一台主机中为所运行的应用程序设置不同的可信边界。假设你的应用是一种为多个客户服务的SaaS应用(例如Salesforce),并允许每个客户通过编写自己的代码扩展应用的功能,这种情况下,你肯定不愿意让某个客户的自定义代码影响到其他的用户,或是获取其他用户的数据。这样一来,就需要用到Hyper-V Containers,它的做法与传统的容器化略有不同,每个容器都将获得Windows核心的一份拷贝,并且将直接为其分配内存,对CPU、内存与IO等资源进行隔离。这种容器能够实现高级别的隔离性,其代价是启动时间将稍稍延长,并且占用资源较高。


Docker如何移植至Windows Server

来自Docker的高级工程经理Arnaud Porterie也在一篇 文章中提到了Docker对Windows Server的支持。他特别指出,这个版本的Windows Server的Docker还没有完成全部特性,但多数Docker命令都可以在Windows Server上使用了,例如Dockerfile与docker build命令。

Docker在Linux上的实现充分地利用了Linux中的一些内核特性,例如命名空间的隔离与cgroups。微软也以类似的方式为Windows内核加入了一些容器化的基本结构,允许用户代码在一个沙盒环境中运行进程。这一功能只限于最新发布的Windows Server 2016。

在Docker的代码中,用于容器执行部分的功能称为execdriver,它在Linux上的默认实现利用了 libcontainer,并且很快将依赖于 runC的实现。对于Windows容器来说,微软在其架构中集成了一个特定于Windows系统的execdriver的实现,它将通过 microsoft/hccshim这个包对Host Compute Service中的内核代码发起调用。