如果了解软件开发的新趋势,那么人们总会听到这两个术语:Docker和Kubernetes,它们实质上是容器和编排的代称。
Docker容器帮助简化了通过开发和测试以及进入生产环境的应用程序迁移过程,而Docker和Kubernetes都帮助重新构建了应用程序的构建和部署方式,也就是作为微服务集合而不是单一堆栈的方式。
Docker和Kubernetes为什么如此重要?它们如何改变软件开发?以及它们各自在过程中扮演什么角色?以下对这些问题进行解答。
Docker和容器
容器是在Linux、Windows和其他现代操作系统中,允许软件在独立于系统其他部分的小型环境中运行。容器被比喻为虚拟机,但它们不是虚拟机,容器更精简,启动和停止更快,并且更加灵活和可迁移。由于容器可以在几秒钟内运行或扩展,因此它们使在诸如云平台之类的弹性环境中运行应用程序变得更加容易。
Linux和其他操作系统多年来一直支持容器化应用程序,但使用容器并不完全是用户友好的。无论是开源的还是商业化的Docker,它都使容器成为一种用户友好和开发者友好的商品。Docker为容器提供了一组通用的工具,因此用户可以将应用程序打包到容器映像中,以便在自己的组织或其他地方轻松部署和重用。
简而言之,Docker可以轻松创建容器映像,对其进行版本控制、共享、移动它们,以及将它们作为运行中的容器部署到与Docker兼容的主机中。
什么时候使用Docker和容器?
Docker和容器适合用户处理必须具有以下一项或多个特性的工作负载:
•弹性可扩展。用户如果不知道需要运行多少个应用实例才能满足需求。可以通过部署更少或更多容器实例来扩展容器化应用或服务以满足需求。
•隔离。用户如果不希望这个应用程序干扰其他应用程序。也许将同时运行多个版本的应用程序,以满足不同版本的API。或者用户想保持底层系统的清洁。
•可迁移性。用户需要在各种环境中运行该应用程序,并且要求每个设置都具有可复制性。容器使用户可以打包应用程序的整个运行时环境,从而使该应用程序易于部署与Docker兼容主机的任何位置,其中包括开发人员桌面、QA测试机、本地裸机或远程云。
Kubernetes和容器编排
容器的设计主要是为了使进程或应用程序与底层系统彼此隔离。创建和部署单个容器很容易。但是,如果用户要将多个容器(例如,数据库、Web前端、计算后端)组装到可以作为一个整体进行管理的大型应用程序中,而不必担心部署、连接、管理,并分别扩展每个容器?用户需要一种方法把所有的部分编成一个功能完整的整体。
这就是Kubernetes要做的工作。如果说容器是邮轮上的乘客,那么Kubernetes就是邮轮的主管。
Kubernetes基于谷歌公司创建的项目,提供了一种自动化跨多个主机部署和管理多容器应用程序的方法,而无需直接管理每个容器。开发人员描述了应用程序跨多个容器的布局,其中包括每个容器如何使用网络和存储等详细信息。Kubernetes在运行时处理其余的部分,它还处理诸如机密和应用程序配置之类的琐碎细节的管理。
Kubernetes需要一定的专业知识才能很好地使用,尽管它比过去更像是一个交钥匙解决方案。易用性方面的某些进步归因于常见应用的简便配方(Helm图表);部分原因是由厂商(Red Hat、Canonical、Docker)发布的大量Kubernetes发行版,这些发行版与流行的应用程序堆栈和开发框架紧密结合。
什么时候使用Kubernetes和容器?
为少数用户提供服务的简单容器化应用通常不需要编排,更不用说Kubernetes了。但是,如果应用程序拥有的功能级别或用户数量超过微不足道的水平,则很难不重新开发编排系统所提供的功能。这是确定何时采用容器的一些经验法则。
•如果应用程序很复杂。任何涉及两个以上容器的应用程序都可以满足要求。也就是说,仅通过少量的解决方案(例如Docker群模式)而不是Kubernetes可以精心安排仅服务于少量用户的适度应用。
•如果应用程序对扩展性和弹性有很高的要求。Kubernetes和其他协调器使用户可以通过描述系统的期望状态,而不是人工编程对变化的条件的反应来平衡负载,并运行容器以声明式地满足需求。
•如果想充分利用现代持续集成 (CI)/持续交付(CD)技术。编排系统支持部署或升级的应用程序的部署模式。
也许会有一天,Docker和Kubernetes甚至会被更友好的抽象所取代,并让位于更优雅的方式来创建和管理容器。但是到目前为止,Docker和Kubernetes对于了解和理解容器和编排很是重要。