虽然相较于物理硬件必需的成本,虚拟机是降低成本的极佳方法,但受限于每个虚拟机只能使用单个操作系统这一事实。 如果想要在单个主机上运行应用程序的多个实例,则容器是绝佳的选择。
什么是容器?
容器是虚拟化环境。 类似于在单个物理主机上运行多个虚拟机,你可以在单个物理或虚拟主机上运行多个容器。 与虚拟机不同,你不用管理容器的操作系统。 虚拟机就像是可以连接和管理的操作系统的实例,但容器是轻型的,其设计目的是实现动态创建、横向扩展和停止。 虽然可在应用程序需求增加的情况下创建和部署虚拟机,但容器的作用旨在使你能够响应基于需求的更改。 使用容器,可以在出现崩溃或硬件中断时快速重启。 最常见的容器引擎之一是由 Azure 支持的 Docker。
容器和虚拟机的差别
模块 | 差异描述 |
快速启动 | docker启动快速属于秒级别。虚拟机通常需要几分钟去启动。 |
资源占用 | docker需要的资源更少,docker在操作系统级别进行虚拟化,docker容器和内核交互,几乎没有性能损耗,性能优于通过Hypervisor层与内核层的虚拟化。 |
轻量级 | docker更轻量,docker的架构可以共用一个内核与共享应用程序库,所占内存极小。同样的硬件环境,Docker运行的镜像数远多于虚拟机数量。对系统的利用率非常高。 |
隔离效果 | 与虚拟机相比,docker隔离性更弱,docker属于进程之间的隔离,虚拟机可实现系统级别隔离; |
安全性 | docker的安全性也更弱。Docker的租户root和宿主机root等同,一旦容器内的用户从普通用户权限提升为root权限,它就直接具备了宿主机的root权限,进而可进行无限制的操作。虚拟机租户root权限和宿主机的root虚拟机权限是分离的,并且虚拟机利用如Intel的VT-d和VT-x的ring-1硬件隔离技术,这种隔离技术可以防止虚拟机突破和彼此交互,而容器至今还没有任何形式的硬件隔离,这使得容器容易受GJ。 |
可管理性 | docker的集中化管理工具还不算成熟。各种虚拟化技术都有成熟的管理工具,例如VMware vCenter提供完备的虚拟机管理能力。 |
高可用和可恢复性 | docker对业务的高可用支持是通过快速重新部署实现的。虚拟化具备负载均衡,高可用,容错,迁移和数据保护等经过生产实践检验的成熟保障机制,VMware可承诺虚拟机99.999%高可用,保证业务连续性。 |
快速创建、删除 | 虚拟化创建是分钟级别的,Docker容器创建是秒级别的,Docker的快速迭代性,决定了无论是开发、测试、部署都可以节约大量时间。 |
交付、部署 | 虚拟机可以通过镜像实现环境交付的一致性,但镜像分发无法体系化;Docker在Dockerfile中记录了容器构建过程,可在集群中实现快速分发和快速部署; |
管理容器
容器通过容器业务流程协调程序进行管理,该程序可以根据需要启动、停止和横向扩展应用程序实例。 可以通过两种方式来管理 Azure 中的 Docker 和基于 Microsoft 的容器:Azure 容器实例和 Azure Kubernetes 服务 (AKS)。
Azure 容器实例
Azure 容器实例提供了在 Azure 中运行容器的最简捷方式,既无需管理任何虚拟机,也不必采用任何其他服务。 它是一种平台即服务 (PaaS) 产品/服务,可用于上传容器并为你直接运行。
什么是 Kubernetes?
kubernetes,简称K8s,是用8代替名字中间的8个字符“ubernete”而成的缩写。是一个开源的,用于管理云平台中多个主机上的容器化的应用,Kubernetes的目标是让部署容器化的应用简单并且高效(powerful),Kubernetes提供了应用部署,规划,更新,维护的一种机制。
Azure Kubernetes 服务
自动化和管理大量容器以及与之交互的任务称为“业务流程”。 Azure Kubernetes 服务是面向容器的完整业务流程服务,包含分布式体系结构和大量容器。
在解决方案中使用容器
容器通常用于通过使用微服务体系结构来创建解决方案。 在这种体系结构中,你可以将解决方案拆分为各个较小的独立部分。 例如,可以将网站拆分为三个容器,一个用于托管前端,另一个用于托管后端,第三个用于存储。 这样可将应用的各个部分拆分成可以独立维护、缩放或更新的逻辑部分。
假设网站后端已达到容量,但前端和存储的容量尚不紧张。 你可以:
- 单独缩放后端以提高性能。
- 决定使用其他存储服务。
- 替换存储容器,而不会影响应用程序的其余部分。
什么是微服务?
微服务(或微服务架构)是一种云原生架构方法,其中单个应用程序由许多松散耦合且可独立部署的较小组件或服务组成。这些服务通常
- 有自己的堆栈,包括数据库和数据模型;
- 通过REST API,事件流和消息代理的组合相互通信;
- 它们是按业务能力组织的,分隔服务的线通常称为有界上下文。
尽管有关微服务的许多讨论都围绕体系结构定义和特征展开,但它们的价值可以通过相当简单的业务和组织收益更普遍地理解:
- 可以更轻松地更新代码。
- 团队可以为不同的组件使用不同的堆栈。
- 组件可以彼此独立地进行缩放,从而减少了因必须缩放整个应用程序而产生的浪费和成本,因为单个功能可能面临过多的负载。