导语:随着以 Docker 为代表的容器技术在国内的迅速发展,容器云也逐渐被广大开发者所熟知,但容器云( CaaS )相比传统的云主机( IaaS )在实际应用中还存在着一些鸿沟。为此,我们试图以通俗精炼的语言向广大开发者介绍容器的特点,应用场景以及优势等。 [深入浅出容器云] 系列文章是由时速云出品,本文是第一篇,欢迎大家不吝赐教。
现有的云计算平台在面对大规模、高弹性计算的需求时往往会遇到一些瓶颈:
1.难以在短时间内启动大规模计算资源来应对高并发的需求;
2.传统 IaaS 的弹性计算性价比低,每个虚拟机都要消耗额外的系统资源。
由于 Docker 容器的启动一般在秒级实现,这相比传统的虚拟机方式要快得多。 另外 Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。容器除了运行其中的应用外,基本不需要消耗额外的系统资源,使得应用的性能很高,同时系统的开销很小。基于虚拟机的技术决定了它的启动速度分钟级(或数秒级),而 Docker 基于轻量级的 LXC ,它的启动速度是毫秒级(秒级)的。这就使得容器云具备高密度,高弹性的特性,在面对突发访问量时也能轻松应对。另外它通过提升应用对系统资源的利用率,使得相比虚拟机的性价比大大的提高了。
基于 Docker 的容器云是一个用于开发、交付和运行应用的平台, Docker 设计用来更快的交付应用程序。 Docker 可以将你的应用程序和基础设施层隔离,并且还可以将基础设施当作程序一样进行管理。 Docker 可以实现更快地打包代码、测试以及部署,并且大大缩短从开发到运行上线的周期。容器云的本质是一个轻量级的容器虚拟化平台,以及一套标准的开发,构建,部署,运行的流程,并且可以集成各类工具,比如持续集成,数据库与缓存,大数据等,以及一些 PaaS 类的服务。容器云在计算资源调度上具备 IaaS 的灵活性,以及 PaaS 的便利,弹性伸缩,日志监控,滚动升级,持续集成 /部署等系统级的 PaaS 服务已成为容器云的标配,并逐渐会往上层发展,比如部署数据库与缓存,大数据,安全监控等服务,以及集成各类 SaaS 服务。
Docker 提供了一种在安全隔离的容器中运行几乎所有应用的方式,这种隔离性和安全性允许你在同一主机上同时运行多个容器,而容器的这种轻量级特性,意味着你可以节省更多的系统资源,因为你不必消耗运行 hypervisor 所需要的额外负载。对于容器云而言,所有的应用都需要容器化以后才能发布,即将应用程序打包进 Docker 容器,以镜像的方式运行。容器化应用未来将会成为云端应用交付的标准。
对于开发者来说,往往希望能够一次构建,随处运行。试想一下,如果你的 team 里 10 个开发者,按传统的方式,每个新来的人往往需要在自己的环境里重复搭建一套开发测试环境,而通常因为系统的不一致(有的人玩 Windows ,有的玩 Ubuntu ,抑或是 Mac ),导致出错率大大提高以及效率的降低。而使用 Docker 之后,开发者可以使用一个标准的镜像来构建一套开发环境,开发完成之后,运维人员可以直接使用这个容器来部署代码。 Docker 可以快速创建容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其他成员更容易理解应用程序是如何创建和工作的。
微服务采用一组服务的方式来构建一个应用,服务独立部署在不同的进程中,不同服务通过一些轻量级交互机制来通信,例如 RPC 、 HTTP 等,服务可独立扩展伸缩,每个服务定义了明确的边界,不同的服务甚至可以采用不同的编程语言来实现,由独立的团队来维护。微服务通常具有相互独立、原子化、松耦合结构等特点。基于 Docker 的容器云更易于微服务架构的实现主要体现在以下几个方面:
1.一个容器即是一个完整的执行环境,不依赖外部任何的东西。
2.一台物理机器可以同时运行成百上千个容器。它的计算粒度足够的小。
3.容器通常是秒级创建和销毁,所以非常适合服务的构建和重组。
4.一系列的容器编排工具,能够快速的实现服务的组合和调度。
比如在时速云的容器编排里,可以支持 Pod 和 Stack 两种级别的编排。 Pod 俗称容器组,直译为豌豆荚,也就是以多个容器为一个调度单元,容器之间共享网络、存储等,它们的关系是同生共死。 Stack 即是彼此之间相互独立的容器之间的组合。
由于 Docker 轻量并且快速,因此相对于基于 Hypervisor 的虚拟机的部署方式, Docker 提供了一种更可行和划算的替代方案,这对于高密度部署环境尤其有用,例如在构建私有云或 PaaS 。当然,当你想在有限的资源里部署更多的应用时, Docker 对于中小型的部署也非常有用。 Docker 容器的运行.需要额外的 hypervisor 支持,它是内核级的虚拟化,因此可以实现更高的性能和效率。
通常,如果要在一台服务器上运行多个任务,传统的方法是将其划分为多个虚拟机,使用每个虚拟机来运行一个任务。但是虚拟机启动很慢,因为它们必须启动整个操作系统,这要花上几分钟的时间。而且这会占用大量资源,因为每个虚拟机都需要运行一个完整的操作系统实例。容器则提供了某种类似的行为,但是速度更快一些,因为启动一个容器就像启动一个进程。
在基于 Kubernetes 的容器云中,可以实现 Pod 和 Stack 两种层面的编排。
1 ) Pod 编排
适用于紧耦合的服务组,保证一组服务始终部署在同一节点,并可以共享网络空间和存储卷。也就是同一个 Pod 内的容器可以通过 localhost 访问彼此服务,共享网络空间,容器的端口不能互相冲突;对于同一个存储卷,可以被同一个 Pod 的多个容器操作。通过 Pod 编排,使我们不需要重新构建镜像,就可以把多个服务进行整合。如果一个容器推荐仅包含一个进程,那么 Pod 更像是可以容纳多个进程的虚拟机。
2 ) Stack 编排
设计上与 Docker Compose 相似,但可以支持跨物理节点的服务之间通过 API 进行网络通信。以上两种编排均支持用 yaml 文件描述多个容器及其之间的关系,定制各个容器的属性,并可一键部署运行。
对于容器云,通常只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都以增量的方式被分发和更新,从而实现自动化并且高效的管理。而以前需要耗费额外的工作去开发的一些管理运维的工作,比如负载均衡,全自动 /半自动弹性伸缩,日志监控,滚动升级等都往往成为了容器云的“标配”,你无需再为这些事情而操心。
容器云的 Docker 容器几乎可以在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、个人电脑、服务器等。 这种兼容性可以让用户把一个应用程序从一个平台直接迁移到另外一个。容器云的这种特性类似于 Java 的 JVM , Java 程序可以运行在任意的安装了 JVM 的设备上,在迁移和扩展方面变得更加容易。