操作系统容器与应用程序容器

操作系统容器和应用程序容器,都是当下最流行的虚拟化技术。

虚拟机

基于虚拟机监控程序的虚拟化技术已存在了很长时间,这种虚拟化技术由管理程序实现。

来宾系统和主机间的通信都通过管理程序完成,这种方式提供了高度的隔离和安全性。

由硬件仿真导致的性能开销较大,为减少这类开销,引入了另一种级别的虚拟化,称为“操作系统虚拟化”或“容器虚拟化”,这种级别的虚拟化,能在同一个内核上,运行多个用户空间实例,实例间相互隔离。

注:Linux操作系统和驱动程序运行在内核空间,应用程序运行在用户空间。

容器

容器是操作系统虚拟化的产物,提供一个轻量级的虚拟环境,将容器中的一组进程和资源(如内存、CPU、磁盘等)进行分组并隔离,这隔离能保证容器内的进程,无法接触到容器外的任何进程或资源。

区别

优点

所有容器共享主机系统的内核,与vm相比开销几乎为0,在运行速度方面也占尽了优势。共享内核使用计算资源得到更好利用。

缺点

能安装的容器类型,取决于能否与主机内核一起工作。说人话就是:不能在Linux主机上安装Windows容器,反之亦然。

主机与容器间隔离性不如虚拟机。

容器用途

作为常规操作系统

应用程序打包机制

基于以上两种用途,将容器分为OS容器和应用程序容器。前者如CoreOS,后者如Docker。

操作系统容器

操作系统容器提供的虚拟环境,以相互隔离的用户空间,共享的内核空间方式实现。

OS容器非常适合运行同一应用不同版本的需求,对相同版本的场景更不是问题。

大多数时候容器是由模板或镜像创建,这些模板或镜像决定了容器的结构和内容。对创建具有相同环境的容器非常方便。

应用程序容器

OS容器旨在运行多个进程和服务,应用程序容器旨在打包和运行单个服务。

启动Docker容器时,会运行一个进程。当为应用程序创建容器时,此过程通常是运行应用程序的过程,这是与传统OS容器不同的地方,在传统OS容器中,一个OS上会运行多个服务。

在Dockerfile中指定的任何RUN命令,都会为容器创建一个新层。最后,当在运行容器时,Docker会将这些层组合起来并运行容器。分层有助于Docker减少重复增加重用。当希望为组件创建不同的容器时。可以从通用的基本镜像开始,然后,添加特定组件。当想要回滚更改时,可以简单地切换到旧的层,这样几乎不会有任何开销。

以MySQL、Node.js、Nginx,三层体系结构的应用转为Docker应用为例:

Docker容器将为每个层构建一个容器镜像,然后,可以单独部署这些镜像,并根据需要创建大小和容量不同的容器。

当需要将应用程序打包并作为组件分发时,应用程序容器是个很好的选择。如果只想要一个可以安装不同库、语言、数据库的操作系统,那么操作系统容器更适合。