为什么Docker容器将占领世界
我加入了bieryun,主持了一个关于Docker的网络研讨会,以及您可以使用容器将传统Windows应用程序迁移到云端以及运行开源无服务器平台。
我分享了Docker容器启用的最常用的用例。这些是公司目前在生产中所做的事情。以下是前五个场景,以及我在现场网络研讨会上对问答的所有答案。
将应用迁移到云端
将现有工作负载迁移到云曾经是IaaS和PaaS之间的选择。PaaS选项意味着将您的应用程序的要求与您选择的云的产品目录相匹配,并采用包含所有托管服务的组件的新架构:
这有利于运营成本和效率,但需要一个项目才能实现 - 您需要更改代码并运行完整的回归测试套件。当你上线时,你只能在一个云上运行,所以如果你想要多云或混合云,它将需要另一个项目。
另一种选择是IaaS,这意味着在云中租用虚拟机。由于您只需要启动一组VM并使用现有的部署工件和工具来部署应用程序,因此初始工作量较少:
但是,将VM环境从数据中心复制到云只意味着要复制所有运营和基础架构的低效率。你仍然需要管理你的所有虚拟机,而且它们仍然大量未充分利用,但现在你有一个月度账单显示它的效率是多么低效。
新方法是首先将应用程序移动到容器,然后在云中运行它们。您可以使用现有的部署工件来构建Docker容器映像,因此您无需更改代码。如果您可以将部署脚本编写到Dockerfile中,那么您可以容纳几乎任何东西 - 它可能是一个已有15年历史的.NET 2.0应用程序或去年的Node.js应用程序:
Docker化应用程序在任何地方都以相同的方式运行,因此开发人员可以使用Docker Desktop在本地运行整个堆栈。您可以使用Docker Enterprise在数据中心或云中运行它们,也可以选择云提供商的容器服务。这些应用程序现在可以移植,运行速度远远超过虚拟机,并使用最新的操作系统,所以这是摆脱Windows Server 2003和2008的好方法,很快就会失去支持。
提供云原生应用程序
从初创企业到大型企业,人们都看到了新型应用程序架构带来的好处。所述云本地计算基础(CNCF)定义了这些类型的应用程序作为具有微服务的设计,在容器中运行,并且由容器平台动态管理。
云原生应用程序可高效运行并轻松扩展。它们是自我修复的,因此应用程序和基础架构问题不会导致停机。它们旨在支持快速,增量更新。在容器中运行的微服务可以独立更新,因此可以推出对产品目录服务的更改,而无需测试支付服务,因为支付服务不会更改:
这个架构来自GitHub上的微服务 - 演示示例,它都打包在容器中运行,因此您可以在笔记本电脑上启动整个堆栈。它使用一系列编程语言和数据库作为每个组件的最佳选择。
现代化传统应用程序
您可以在同一群集上的Docker容器中运行现有应用程序和新的云原生应用程序。它也是一个发展遗留应用程序的绝佳平台,因此它们的外观和感觉更像是云原生应用程序,而且您可以在没有2年重新架构项目的情况下完成。首先将应用程序迁移到Docker。此示例适用于单个ASP.NET Web应用程序和SQL Server数据库:
现在,您可以开始从整体中断出功能并在单独的容器中运行它们。版本2可以使用反向代理来引导现有monolith与在单独容器中运行的新应用程序主页之间的流量:
这是一个简单的模式,用于分解Web UI而无需更改原始整体中的代码。对于下一个版本,您可以打破应用程序的内部功能,并将其作为在另一个容器中运行的REST API公开:
这些新组件完全独立于原始组件。你可以使用你喜欢的任何技术堆栈。每个功能都可以有自己的发布节奏,您可以按需要的比例运行每个组件。
技术创新:无服务器
到目前为止,您已经在同一群集上的Docker容器中运行了遗留应用程序,云原生应用程序和不断发展的单块。您以相同的方式构建,打包,分发,运行和管理所有应用程序的所有组件。您的整个应用程序环境都在一个安全,现代和开放的平台上运行。
它并没有就此结束。可以使用相同的平台来探索技术创新。无服务器是一种很有前途的新部署模型,它由容器驱动。AWS Lambda和Azure功能是专有实现,但是有许多开源无服务器框架可以在数据中心或云中与Docker一起部署:
所述CNCF无服务器工作组定义的当前选择的通用架构和管道的过程。如果您对无服务器模型感兴趣,但是您在本地或跨多个云运行,那么开放框架是一个很好的选择。Nuclio很容易上手,它在与其他应用程序相同的平台上的Docker容器中运行。
流程创新:DevOps
下一个重大创新是DevOps,它旨在打破构建软件的团队和运行软件的团队之间的障碍,目标是更快地将更好的软件推向市场。DevOps更多的是关于文化和流程,而不是软件,但如果你仍在使用相同的技术和工具,很难做出有影响力的改变。
CALMS是一个很好的框架,用于理解DevOps转换中要关注的领域。它是关于文化,自动化,精益,指标和共享的关键部分。如果您通过技术变革为其提供支持,那么在这些领域取得进展并量化成功要容易得多。采用容器支撑该框架:
当团队使用相同的工具并使用相同的语言时,将团队整合在一起要容易得多 - Dockerfiles和Docker Compose文件与应用程序源代码一起使用,并由Dev和Ops共同拥有。它们提供了共同合作的共同点。
自动化是Docker的核心。手动制作容器要比使用Dockerfile自动化容器要困难得多。将应用程序分解为小型单元支持精简,您可以将指标烘焙到所有这些组件中,以便为您提供一致的方法来监控不同类型的应用程序。Docker Hub可以轻松共享,其中有数十万个应用程序打包为Docker镜像。
网络研讨会问答
我们在会议结束时提出了很多问题,没有足够的时间来回答这些问题。以下是错过的问题。
问:你说你可以在你的笔记本电脑上运行你的投票应用程序,但它是Linux和Windows容器的混合体。这不会有用吗?
答:不,你不能在一台机器上运行Linux和Windows容器的混合体。您需要有一个运行Docker Swarm的集群,其中包含Linux和Windows服务器的混合体。示例投票应用程序具有不同的版本,因此它可以在所有Linux,全Windows或混合环境中运行。
问:使用Docker容器从源代码编译[你的应用程序]是什么?在这种情况下MSBuild?
答:是的,您编写了一个多阶段Dockerfile,其中第一阶段编译您的应用程序。该阶段使用已部署工具集的Docker镜像。Microsoft拥有.NET Framework SDK映像和.NET Core映像,还有其他平台(如Go和Maven for Java)的官方Docker映像。您可以构建自己的SDK映像并打包所需的任何工具。
问:如果群集中安装了遗留应用程序,我们如何使用Docker swarm或Kubernetes维护粘性会话?
答:您的群集节点上将有一个负载平衡器,因此流量可以进入任何服务器,然后您可以在该服务器上运行多个容器。Docker Swarm或Kubernetes都没有为开箱即用的容器提供会话亲和性,但你可以通过运行像Traefik这样的反向代理或者像Nginx这样的Kubernetes的会话感知入口控制器来实现。
问:在桌面上进行测试时,不同的操作系统要求如何工作?(例如,某些容器需要Linux,有些需要Windows,而Mac则用于开发)
答:容器非常有效,因为它们使用运行它们的主机的底层操作系统。这意味着Linux容器需要在Windows主机上的Linux主机和Windows容器上运行。Docker Desktop使这一切变得简单 - 它为您提供和管理Linux VM。Docker Desktop for Mac只允许您运行Linux容器,但Docker Desktop for Windows支持Windows和Linux。
问:IDE如何适应Docker(例如,确保所有开发团队成员都使用兼容的IDE配置)?
答:使用Docker从源代码编译和打包应用程序的好处在于人们使用的IDE无关紧要。当开发人员在本地测试应用程序时,他们将使用具有CI使用的相同构建脚本的Docker容器来构建和运行它。因此构建是一致的,团队不需要使用相同的IDE - 人们可以在同一个项目中使用Visual Studio,VS Code或Rider。
问:如何协调Windows容器的最佳方法?
答:现在只有Docker Swarm支持生产中的Windows节点。您可以将多个Windows服务器与Docker Swarm一起加入,或者使用Docker Enterprise配置混合的Linux-Windows群集。预计到2018年底,Kubernetes将支持Windows节点。
问:我是否需要管理程序来管理我的Docker环境运行的底层硬件?更好的是,使用Docker是否可以满足对VMware的需求?
答:Docker可以在裸机或VM上运行。生产Docker服务器只安装了最小的操作系统(比如Ubuntu Server或Windows Server Core)和Docker。
问:在容器中运行的SQL Server可以使用Windows身份验证吗?
答:是的。默认情况下,容器不是域加入的,但您可以使用凭据规范运行它们,这意味着它们可以使用组管理的服务帐户的凭据访问AD。
问:对于旧的Eclipse IDE依赖,在容器内构建/编译Java的任何建议吗?
答:您需要在没有任何IDE的情况下通过脚本构建应用程序。如果您可以迁移构建以使用Maven(例如),那么您可以在Dockerfile中使用Maven设置构建和打包。
问:那么,服务器必须拥有容器所需的所有应用程序?如果服务器没有容器需要的应用程序,会发生什么?
A.不,恰恰相反!Docker镜像是包含容器所需内容的包。因此,Docker镜像中的ASP.NET应用程序将安装.NET Framework,IIS和ASP.NET,并且您不需要在运行容器的服务器上安装任何这些组件。
问:如果您需要多种技术来运行应用程序,如何在单个包中创建支持它们的Docker镜像?如果您需要一个不易获得的特定技术堆栈呢?
答:您的应用程序映像需要安装应用程序的所有先决条件。您可以使用现有图像,如果它可以为您提供所需的一切或构建自己的图像。只要您可以编写脚本,就可以将其放在Dockerfile中 - 因此Windows Dockerfile可以使用Chocolatey来安装依赖项。
问:Docker如何决定哪些库/运行时将成为容器的一部分?它如何划分OS和其他运行时?
A. Docker没有决定。这取决于构建应用程序映像的人。目标是使您的应用程序实际需要的依赖项尽可能地使您的运行时映像尽可能小。这为您提供了更小的攻击表面区域,并缩短了构建和部署的时间。