通常我们指容器而是一个容納其它物品的工具,可以部份或完全封閉,被用於容納、儲存、運輸物品[3]。物體可以被放置在容器中,而容器則可以保護內容物。我们参考:https://zh.wikipedia.org/wiki/%E5%AE%B9%E5%99%A8
虚拟化
我们知道常规虚拟化的形式,主流的有两种。
第一种主机级虚拟化,虚拟整个完整的物理平台。比如vmwarer,vmware创建的虚拟机就像一个完整的物理一样。可在之上安装不同的虚拟机,虚拟机系统。其中也有两种类型的实现。
类型一:直接在硬件平台安装虚拟机管理器,Hypervisor。也就是说没有任何主机是运行在硬件之上的,所有的主机都是跑在虚拟机上。
类型二:包含vmwaer workstation,virtualbox。需要在物理机之上先安装host os,也就是宿主机系统。在宿主机智商安装vmware,在vmwaer之上在创建虚拟机。
这种的实现机制方式如下:
首先是底层硬件平台,暂且不管主机级虚拟化是Host os还是其他,虚拟出的环境是一个独立的硬件平台。用户要使用虚拟机,就需要在虚拟机之上部署一个完整意义的操作系统,系统中必然是有内核,内核中也会有用户空间,用户空间运行进程。
但是,运行内核只是让内核完成资源分配,内核中运行的应用程序才是我们最终要的。如:提供的web应用nginx,httpd等。都是运行在用户空间的应用进程。而这些应用进程产生生产力的才是我们想要的,而不是出于通用目的设计的资源管理平台的系统内核。但是这个内核,不得不有,在硬件平台上使用应用程序都是根据内核调用和库调用研发,没有这些内核环境是无法运行应用程序的。并且在用户空间内进程协调也必须要内核来实现。假如创建的虚拟机就只有一个单一的目的,如:tomcat。但是要运行tomcat就必须要虚拟出硬件,安装操作系统安装环境后运行,这样的消耗无疑是很大的。
如果用虚拟化二类型来看,一个进程需要运行需要实现两级调度和资源分配。虚拟机本身的内核就已经是一次内存虚拟化,CPU调度。io调度管理等等。而虚拟机本身也是被宿主机内核管理另一层虚拟化(或者Hypervisor)管理调度一次,这中间无疑是浪费。
传统的虚拟化技术,可以在一组硬件平台之上实现所谓的跨系统环境隔离,调用,高效应用等等。但是资源的开销也是很大。
容器
既如此,减少中间层的环节是有效提供效率的方式。如果此时将虚拟机os这层抽取掉,只保留进程。那这样也是有问题的,资源隔离就是问题。
虚拟机可完成环境隔离。如:一台主机是不能使用相同的套接字端口的。而虚拟机就可以进行隔离实现的。并且不会影响到其他主机
而资源隔离才是我们想要的。因此就算抽取掉中间os内核,也需要做到每一组进程彼此之间是互相不可达,和虚拟机物理机一样的互不干扰,仅仅共享使用同样的底层资源而已,这种资源隔离是需要实现的。
那这样的话,环境就可能变成这样.
首先,有硬件平台,在硬件平台之上提供所谓的虚拟的隔离环境管理器,而后创建隔离环境,隔离的进程就运行在隔离环境内。如上图。
但是,进程运行在用户空间,内核提供的是内核空间,用户空间要运行在隔离环境中。事实上隔离的就是用户空间。用户空间被隔离成多组,彼此之间互不干扰,一个空间运行部分进程或者一个。但是不管如何隔离,其中必然会有一个,或者第一个是进行管理其他用户空间的。
随后启动进程的时候,进程运行在用户空间当中。众多用户空间共享底层同一个内核。但是在运行时候看到的边界,是自己所属用户空间的边界。
这种隔离是没有主机虚拟化隔离的那么彻底,而且隔离的用户空间是用来放进程的,给进程提供运行环境,同时保护内部进程不会其他进程干扰,这种方式就称为容器技术。