云原生应用本质上是分布式的,充分利用了云基础架构的特性,构建一个云原生应用有很多不同的技术和工具,从计算的角度来看主要有两个,一个是容器,另一个是函数计算。从架构的角度来看,微服务架构已经受到了很多人的欢迎。这几个术语经常会被搞混,甚至被认为是指同一个东西。但事实上,函数计算和容器是不同的技术,它们的功能是不一样的,而微服务则描述了一种架构风格。也就是说,理解了如何利用好函数计算和容器技术,配合事件通知和消息通信相关技术,开发者们就可以最有效和快速地构建下一代基于微服务架构的云原生应用。
如今人们在谈论容器时,大多数时候指的都是“Docker容器”。尽管在Linux操作系统(OS)中,容器的历史可以追溯到十多年以前,然而真正使得容器广为人知的,是因为Docker。容器的最初想法是把操作系统分割成几块,每一块都可以安全地运行应用程序,它们之间不会产生相互干扰。这种隔离的办法是用命名空间(namespace)控制组(control group)来实现的。命名空间和控制组是Linux内核的功能。命名空间允许操作系统的各个组件被切分成若干块,从而创建隔离的工作区。然后,控制组可以用来对资源的使用进行细粒度的控制,从而有效防止所有系统资源被一个容器霸占。
对于开发者而言,直接调用系统内核的功能比较麻烦,因此引入了Linux容器(LXC),它是现在人们所熟知的“容器”的底层技术,极大地简化了与系统内核交互的复杂性。正是Docker通过把这些复杂的内核功能封装成对开发者友好的组件,才使得容器流行起来。Docker对容器的定义是
一个“标准化的软件单元”
。“软件单元”更准确的意思是指运行在容器中的服务或者应用能够完全地、私有地访问操作系统视图(操作系统视图的含义是指它与其他容器实例所访问的操作系统是相互隔离的)。换句话说,你可以把容器看作是经过封装的,可以被独立部署的一个组件,这个组件通过系统级别的虚拟化技术使其可以作为一个独立的实例来运行并和其他实例共享同一个系统内核。
此外,容器使用**写时复制(copy-on-write)**的文件系统策略,这就允许多个容器实例可以共享数据,因为只有当容器需要修改或者写入新数据时,操作系统才会复制一个数据的副本。所以从内存和磁盘空间使用的角度来看容器是非常轻量级的,这也是为什么容器可以非常快地启动,快速启动是容器带来的巨大好处之一。容器还有其他好处,比如部署的一致性、在多环境下的可移植性、隔离性和更高的部署密度等。对于现代的云原生应用而言,容器镜像已经成为集应用服务代码的封装、运行环境、依赖项和系统库等于一体的部署单元。因为容器具有快速启动的特性,所以非常适合用在需要快速横向扩容的场景,比如云原生应用。