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

阅读数:590 2017 年 11 月 15 日

话题:WindowsDevOps

本文要点:

  • 在 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

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