现代软件开发的目标之一是应用程序既能运行在同一主机或集群上,又能彼此隔离,这样它们就不会过度干扰彼此的操作或维护,但由于要运行包、库和其他软件组件,这样就会变得会比较困难。
解决这个问题的方案之一是用虚拟机,它将相同硬件上的应用程序完全隔离,并将软件组件之间的冲突和硬件资源之间的竞争降到最低,但是虚拟机体积比较庞大,每个虚拟机都需要自己的操作系统,所以通常是GB大小而且很难维护和升级。
与虚拟机相反,容器将应用程序的执行环境彼此隔离,但共享底层OS内核。它们通常以兆字节为单位,使用的资源比虚拟机少得多,而且几乎是立即启动的。可以做到在相同的硬件上更密集地打包,而不需要花费太多的精力和开销。
容器提供了一种高效和高粒度的机制,将软件组件组合到现代企业所需的各种应用程序和服务堆栈中,并保持这些软件组件的更新和维护。
Docker是一个开源项目,可以轻松创建容器和基于容器的应用程序,最初是为Linux构建的,现在也可以在Windows和MacOS上运行。
一直以来Docker都可以帮助开发人员快速构建轻量级和可移植的软件容器,从而简化应用程序开发、测试和部署等诸多环节。具体来说,它是一个用于构建应用程序的软件平台,可以提供一种小型和轻量级的执行环境用来共享操作系统内核,但在其他方面是独立运行的。
虽然容器概念已经出现不短的时间,但2013年推出的开源项目Docker在很大程度上帮助推广了这项技术,并推动了软件开发中容器化和微服务的趋势,这种趋势后来被称为云原生开发。
Docker容器提供了一种构建企业应用程序和业务流程应用程序的方法,这些应用程序比传统应用程序更容易安装、维护和移动。
Docker容器支持隔离:Docker容器使应用程序不仅彼此隔离,而且与底层系统隔离。这不仅使软件栈更干净,而且更容易使容器化应用程序使用系统资源,例如CPU、GPU、内存、I/O、网络等,它还可以确保数据和代码保持独立。
Docker容器支持可移植性:Docker容器在支持容器运行环境的任何机器上运行。应用程序不必绑定到主机操作系统,因此可以保持应用程序环境和底层操作环境的整洁和最小化。
例如,采用容器的MySQL将在大多数支持容器的Linux系统上运行,应用程序的所有依赖项通常都在同一个容器中提供。基于容器的应用程序可以轻易从on-prem系统迁移到云环境中,或从开发人员的笔记本电脑移到服务器上,只要目标系统支持Docker以及可能与之一起使用的任何第三方工具,比如Kubernetes。
通常,Docker容器镜像必须为特定的平台构建。例如Windows容器不能在Linux上运行,反之亦然;以前,绕过此限制的一种方法是启动运行所需操作系统实例的虚拟机,并在虚拟机中运行容器。
然而Docker团队后来设计了一个更优雅的解决方案,称为manifest,它允许多个操作系统的镜像并行打包。尽管manifest虽然还处于试验阶段,但这暗示了容器可能成为跨平台应用程序解决方案和跨环境应用程序解决方案。
Docker容器支持可组合性:大多数业务应用程序由几个独立的组件组成,web服务器、数据库和cache缓存。Docker容器可以将这些部件组合成一个容易更换的功能单元。每个部分由不同的容器提供,可以独立于其他容器进行维护、更新、交换和修改。
这本质上是应用程序设计的微服务模型。通过将应用程序功能划分为独立的、自包含的服务,微服务模型为过程缓慢的传统开发和单一僵化的应用程序提供了一种解决方案,轻量级和便携式容器使构建和维护基于微服务的应用程序变得更加容易。
Docker容器简化了编排和扩展:由于容器是轻量级的,并且开销很小,所以可以在给定的系统上启动更多的容器,而且容器也可以用于跨系统集群扩展应用程序,并将服务向上或向下扩展以满足高峰需求或节约资源。
用于部署、管理和扩展容器的大多数企业级工具版本都是通过第三方项目提供的。其中最主要的是谷歌的Kubernetes,这是一个支持容器部署和扩展的自动化系统,还支持容器连接、负载平衡和管理。Kubernetes还提供了创建和重用多容器应用程序或“Helm charts”图表的方法,这样就可以根据需要构建和管理复杂的应用程序堆栈。
Docker还内置了Swarm编排模式,目前该模式应用比较少,Kubernetes已成为某种默认选择。事实上Kubernetes与Docker Enterprise Edition捆绑在一起。