BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Elton Stoneman访谈:工作负载的迁移和在Windows上运行Docker

| 作者 Manuel Pais 关注 8 他的粉丝 ,译者 姚佳灵 关注 0 他的粉丝 发布于 2017年11月16日. 估计阅读时间: 18 分钟 | QCon北京2018全面起航:开启与Netflix、微软、ThoughtWorks等公司的技术创新之路!

亲爱的读者:我们最近添加了一些个人消息定制功能,您只需选择感兴趣的技术主题,即可获取重要资讯的邮件和网页通知

本文要点:

  • 在Windows Server 2016和Windows 2010上都有Windows原生 Docker,都得到微软和Docker这两家公司的支持。
  • 尽管Windows容器比Linux容器占用的空间大,但是由于容器进程直接在主机服务器上运行,所以它们的运行效率仍然比VM高出大约10倍。
  • Docker具有积极的文化影响,因为开发和运营团队不仅可以共享开发文件(Dockerfiles和Docker 镜像),而且还可以共享开发语言和工具。
  • 预计到2017年底,将会实现跨Windows和Linux容器的奇偶校验功能,微软正在努力缩减基础镜像的大小,并扩展网络的能力。
  • 任何一款无需UI就能够安装和运行的Windows应用程序,也应该能在Docker中运行。很多组织正在把旧版本的Windows应用程序迁移到类似Windows Server 2016这样更现代的服务器上运行。

Windows上的Docker还处在早期阶段,但工作负载方面的可能性在不断增加。InfoQ采访了Elton Stoneman,了解如何在Windows上运行容器以及哪种工作负载是迁移的理想选择。Elton Stoneman是《Docker on Windows》一书的作者,并在最近的WinOps大会上做了演讲。

InfoQ:能否请您简要地自我介绍一下?您从事什么工作?是什么把您带入了容器领域?

Elton Stoneman: 当然可以。我是Azure MVP,也是Pluralsight的作者。在加入Docker公司之前,我从事了15年的咨询工作。我的工作背景是Windows和.NET编程,特别是使用ASP.NET、WCF、Web API和SQL Server的大型服务器应用程序。2014年,我做了一个大型的Azure项目,为某种Android设备提供API。那是个跨平台的项目,Linux团队用Docker来运行他们的开发工具。我对此产生了兴趣,开始大量使用Docker,写了有关Docker的博客,做了演讲,并受邀加入Docker Captains项目(与微软的MVP相当)。之后在Docker公司担任Developer Advocate的角色,这让我有机会完全集中于Docker和微软的生态系统,这也是目前我所从事的工作。

InfoQ:能否请您讲讲Windows “原生”Docker的现状?

Stoneman:“原生”意味着在容器中的应用程序使用主机的操作系统。如果在Docker容器中有10个ASP.NET应用程序在运行,那么在服务器的任务列表上可以看到10个“w3wp.exe”实例。容器仍然是隔离的单元,每个应用程序认为自己是在一个单独的服务器上运行,拥有一个主机名和一个IP地址,但事实上容器进程彼此独立。这使得Docker极其高效,在服务器上运行大量的容器就好像在笔记本上运行大量的应用程序。Windows
Server 2016支持原生Windows容器,同时,在Windows Server 2016的授权中已经包括了Docker企业版,因此可以从微软和Docker公司获得产品支持。

InfoQ:基于Windows的Docker容器的主机是否必须运行特定的Windows操作系统?

Stoneman:在Windows Server 2016上只能运行进程独立的Windows容器,并且在裸机或虚拟机、本地或云上也一样。在台式机上,可以在Windows 10上运行Docker Community版本。它采用了不同的隔离模式(每个容器在自己的Windows Server 2016内核中运行),但是运行的方式及容器的管理跟在服务器上是一样的。

InfoQ:Windows通常比Linux占用更多的内存和资源,那么会不会有这样的风险:最后成了运行非常类似虚拟机的“胖容器”?

Stoneman: Windows容器和Linux容器是不同的,但是Windows容器仍然比VM高效。Linux容器把Alpine Linux(这是个10MB的操作系统)作为基础,在一个独立的进程中运行应用程序。Windows容器必须把Windows Server内核(这是个10GB的操作系统)作为基础。并且,应用程序进程将与容器中的多个后台Windows服务一起运行。

但是,Windows容器仍然直接在主机服务器上运行进程,在应用程序和计算资源之间没有重量级的虚拟机。通常,我们看到客户能获得5倍到10倍的效率提升。因此,一台可以运行10个虚拟机的服务器能运行100个容器。众多的Docker客户在迁移到容器时,可以立即看到投资回报,因为他们不再需要大量服务器或云虚拟机。

同时,存储效率也提高了。把应用程序打包进一个Docker镜像,Docker镜像是一个应用程序版本的完整快照,带有其所有的依赖项、配置和应用程序运行时。镜像被分为几个共享层,因此,如果在Docker镜像中有那10个被打包的ASP.NET应用程序,它们将共享同样的10GB Windows Server内核基本镜像,只有镜像之间的差别部分会被保存到物理存储里。

InfoQ:您是否能从技术和文化角度,给我们简单讲讲到目前为止,Windows的Docker遇到的最大障碍及其关键的里程碑?

Stoneman:运行应用程序的新方式是最大的文化挑战,对于工程师和运营团队来说有学习曲线。但是,他们可以很快上手Docker,而且马上就能看到以同样的方式建立、分发和管理所有应用程序的优点。迁移到Docker通常带来正面的文化影响。开发和运营团队开始一起处理一套相同的组件:Dockerfile和Docker镜像。于是,他们开始使用相同的开发语言和工具,这对迁移到DevOps确实非常有帮助。

从技术上来说,还有些Docker功能只有Linux才有。不过,针对Windows Server下一次更新的工作正在进行当中。因此,到2017年未,我们应该能够实现大部分跨Windows和Linux的容器兼容性。公司需要做的最大投资是编写Dockerfile来打包应用程序,同时把Docker集成到CI/CD进程中。像Jenkins、TFS和VSTS这样的工具都支持Docker。因此,通常会形成一个更整洁、简单的工作流,便于自动更新部署。要达到这个目标,还有些工作要做。

InfoQ:Docker是建立在Linux内核隔离功能之上的,比如cgroups和namespaces。如何在Windows环境中实现呢?

Stoneman:那些核心的Linux功能存在已久,建立在这些功能之上的Docker让容器变得更易于使用。它们从未存在于Windows中,但是,在微软设计Windows Server 2016时,希望增加对Windows容器的支持。微软和Docker的工程师团队一起努力实现了这个目标。它的实现不同于Linux,但有个类似的API。因此,Docker能以相同的方式管理容器。如果想要深入了解,可以从视频Microsoft at DockerCon 16中获得更细节的信息。

InfoQ:如今,可以把哪种Windows工作负载安全地迁移到Docker上?您是否有实例可以分享一下?

Stoneman:任何一款无需UI就可以安装运行的Windows应用程序都应该能在Docker上运行。

我们通常会与那些Docker化其自有应用程序的客户一起工作,那些应用程序的范围从旧的ASP.NET WebForm应用程序直到新的Go语言应用程序。Docker不会对应用程序的风格施加限制,因此可以在Windows Server内核容器中运行一个单独的网页应用程序,在跨多个Nano服务容器上运行微服务应用程序,这些都在同个集群上运行。有相当多的客户在利用Docker从更旧的Windows版本(比如Windows Server 2003)进行迁移。接下来,他们可以迁移到云或更现代的基础设施上。

在Microsoft Ignite,我们和那些走完Docker历程的客户们进行了交流,MetLifeFox都是真实的例子。我们也可以打包现成的应用程序到Docker容器里运行,前提是该应用程序支持脚本化安装。当然,还有一些服务器工作负载是不能在Windows容器里运行的,Microsoft Message Queuing(MSMQ)就是一个例子,原因在于它不受Windows Server内核镜像的支持。

InfoQ:谁在做支持更多的Windows工作负载的扩展工作?是否有路线图?

Stoneman:微软对Windows容器最关注的是缩减基础镜像的尺寸大小,扩展Windows Server的网络能力,提高Linux Docker和Windows Docker之间的兼容性。微软在Docker Hub上为其某些关键工作负载维护镜像,比如:SQL Server、ASP.NET和.NET Core。在Docker Hub上还有官方镜像,是由Docker和产品团队策划的可信应用程序。目前,其中的大多数是Linux的,但是用Windows OpenJDK镜像可以运行Java应用程序,同时NATS消息队列也有Windows镜像。

任何人都可以把Windows应用程序打包到Docker镜像中,然后(在产品许可的情形下)在Docker Hub上发布,因此,我们将看到更多的开源项目提供Windows Docker镜像。在Docker Hub上发布镜像(如果是商用应用程序,会发布在Docker Store上),让用户们非常方便地试用那些应用程序,他们所需要的就是Docker,应用程序自身所需的一切都在镜像中。

InfoQ:微软是如何发行容器许可的?

Stoneman:微软基于主机发行容器许可。因此,只需为运行Windows的服务器或虚拟机支付费用,不需要为Windows Server容器获取许可证。因此,如果是一台服务器,就算运行100个容器,也只需购买一个Windows许可。

InfoQ:如果在Windows上采用Docker,从头开始做的话,您推荐什么样的路径图?就基础设施、应用程序以及流程和技能来说,哪些是必须要考虑的?

Stoneman:如果想学习基础知识,可以从WinOps Docker on Windows: The Beginner’s Guide起步。它涵盖了需要了解的关键概念:Dockerfile、镜像、注册表、容器和协调器。如果想上手,可以在GitHub上找找这个:Docker on Windows Workshop,看看如何把现有的应用程序迁移到Docker。

在此之后,应该准备好进行你自己的概念验证,并把你现有的一个应用程序迁移到Docker。先从简单的开始,一个没有太多集成的ASP.NET网页应用程序是一个不错的选择,应该在一两天里就可以实现在Docker中运行了。对于更大的组织,Docker公司会借助“Modernize Traditional Applications”计划来帮助进行PoC。当然,你也可以参看我的这本书《Docker on Windows》。

InfoQ:在演讲中,您提到了一个叫“Image2Docker”的辅助工具,能否请您简单地解释一下它的功能?还有其它工具可以用来帮助迁移到Docker吗?

Stoneman:Image2Docker是一个把现有的应用程序迁移到Docker的PowerShell工具。目前,它针对的是ASP.NET应用程序,它能连接一台远程设备或者一个虚拟设备硬盘,从源代码中提取应用程序内容,同时建立一个Dockerfile把该应用程序打包成一个Docker镜像。看到你的应用程序在Docker里运行是个好的开始,当和那些拥有现成套件的客户合作时,我们将其用于PoC,将那些套件迁移到Docker。

据我所知,Image2Docker是可以将部署好的应用移到Docker的唯一工具,但是对于源代码,很多IDE有内置的Docker支持。Visual Studio 2017有最高级的功能集可以把Docker支持添加到应用程序中。它生成Dockerfile来打包应用程序镜像,可以通过Visual Studio在容器中运行应用程序,就好像它在本地运行一样。

InfoQ: Windows的IT人员是否能够在没有任何Linux知识的情况下使用Docker?

Stoneman:当然可以。Docker是跨平台的,在Linux、Windows、IBM大型机和Raspberry Pi上以相同的方式运行。如果只在Windows容器中运行,就无需学习任何Linux知识。只需学习基本的Docker命令(像docker image build和docker container run),以及如何使用Dockerfile打包你的应用程序。Dockerfile的语法非常简单,大多数情况下你只要在Dockerfile中编写PowerShell或批处理命令,无需学习大量的新东西。

InfoQ:在大型组织中,您认为Windows上的Docker在打破操作系统层面的孤岛现象(Windows IT与Linux IT)上会更进一步吗?或者,仍然需要这两个平行的技能组合?

Stoneman:对Docker来说,无论是在Linux容器中运行Go应用程序,还是在Windows容器中运行ASP.NET WebForm应用程序,看上去都一样。在Linux服务器上只能运行Linux容器,在Windows服务器上只能运行Windows容器,但是可以把多个Linux和Windows服务器加入到一个单独的集群中,并以相同的方式管理所有的工作负载。由于这个原因,Docker的企业版对于拥有不同工作负载的公司很有吸引力,只要一个控制台就可以管理所有应用程序。能用同样的工具、相同的方法构建、部署、扩展、更新、保护和管理它们。

对于IT团队来说,Docker很容易和来自“另一端”的应用程序一起工作。Windows开发人员能通过运行Linux容器中的Elasticssearch和Kibanan为他们的应用程序添加分析功能。Linux管理员可以为Windows容器中的SQL服务器数据库建立CI/CD管道。我认为我们很快会实现这个目标:从用户的角度来看,在容器里有什么东西真的不重要。维护人员将仍然需要了解内部情况以便打包最有效和最安全的镜像,但是我相信工具会进化,最终会成为一个简单任务。

受访者简介

Elton Stoneman Elton Stoneman是微软的MVP,Pluralsight的作者InfoQ编辑。他在Docker公司工作。Elton为Docker、.NET和Azure写了不少博客推文。他也经常在会议上发表演讲。他期待着nei xt DockerCon的开幕。
 

查看英文原文:Q&A with Elton Stoneman on Migrating Workloads and Running Docker on Windows

感谢薛命灯对本文的审校。

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT