物理机、虚拟机和容器的区别
虚拟机
(一)虚拟机技术
虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。
虚拟化是表示计算机资源的逻辑组(或子集)的过程,这样就可以用从原始配置中获益的方式访问它们。这种资源的新虚拟视图并不受实现、地理位置或底层资源的物理配置的限制。
虚拟化技术可针对具体应用目的创建特定目的的虚拟环境,安全、效率高,快照、克隆、备份、迁移等方便。系统虚拟化是将一台物理计算机虚拟成一台或多台虚拟计算机系统,每个都有自己的虚拟硬件,其上的操作系统任认为自己运行在一台独立的主机上,计算机软件在一个虚拟的平台上而不是真实的硬件平台上运行。虚拟化技术可以扩大硬件的容量,简化软件的重新配置过程。其中CPU的虚拟化可以单CPU模拟多CPU并行运行,允许一个平台同时运行多个操作系统,并且应用程序可以在相互独立的空间内运行而互不影响。虚拟化技术在降低硬件成本的同时,还可以显著提高系统的工作效率和安全性。
虚拟化系统的实现通常是在操作系统和硬件之间加入一个虚拟机监控程序,称为Hypervisor(如图所示)。由Hypervisor主要负责各个操作系统之间的硬件资源协调。虚拟机监控程序是一种特殊操作系统,直接在裸机上运行(针对完全虚拟化技术)。虚拟机监控程序创建一个底层硬件平台抽象,一个或多个虚拟机(VM)共享这个底层硬件平台。在这种环境中,VM只是操作系统及其应用程序的容器,一个 VM 与虚拟机监控程序上运行的其他 VMs 隔离,这支持多个操作系统或多个配置不同的相似操作系统。
1.虚拟计算机系统三层含义-同质、高效、资源受控。
同质-本质上虚拟机和物理机是相同的、表现上有所差异,如一个物理核虚拟多个核。
高效-虚拟机效能接近物理机。
资源受控-虚拟机对系统资源有完全的控制能力,包括分配、管理、回收。
2.虚拟化分不同层面的虚拟化
硬件抽象层的虚拟化-客户机与宿主机硬件相似,指令集相似。
操作系统层虚拟化-内核可以提供多个相互隔离的用户态,其拥有独立的文件系统、网络、系统设置和库函数。
库函数层初始化-是不同的操作系统可以拥有共同的库函数接口,应用程序不需修改。
编程语言层虚拟化-编的程序运行在一个虚拟机上,与具体硬件无关。如Java。
3.虚拟机的优点
良好的封装-虚拟机的运行环境保持便捷,便于随时抓取状态、备份、克隆、挂起和恢复。
多实例-最大限度减少物理资源,提高利用率,便于管理。
隔离-每个应用程序可以再独立的操作系统中运行,互不干涉,崩溃也不会影响其他任务。
硬件无关性-只要拥有相同的硬件抽象层,虚拟机就可以无缝迁移,因此维护和升级简单。
安全-便于控制访问权利,病毒入侵检测等。
4.虚拟化分类
按照虚拟化程度分完全虚拟化和类虚拟化。完全虚拟化-客户及操作系统不需要任何修改即可运行,分软件辅助完全虚拟化和硬件辅助完全虚拟化,完全虚拟化能够模拟所有CPU指令。
类虚拟化-操作系统需要做出适应性修改,回避那些难以模拟的指令。
按照宿主机是否存在独立操作系统分为hypervisor模型和宿主模型,前者需支持所有的物理资源管理(系统启动、内存管理、设备驱动等),效率高、复杂;后者只需调用宿主操作系统API实现虚拟化,宿主操作系统可以是windows、linux,效率低、简单。第三类是两者的混和,VMM位于硬件层之上,但让出部分IO设备管理权给一个运行在特权虚拟机上的特权操作系统,VMM负责处理器和内存虚拟化。
(二)虚拟化技术框架
虚拟环境组成:硬件、VMM、虚拟机,物理机中操作系统直接管理硬件(通过硬件抽象层HAL),虚拟环境中VMM管理硬件(会构建一个或多个逻辑HAL),操作系统运行在VMM 逻辑HAL之上,运行在非CPU最高特权。
对物理资源虚拟的三个主要任务:处理器虚拟化、内存虚拟化和I/O虚拟化。若硬件直接支持虚拟化技术则CPU辅助完成虚拟化过程,在CPU、芯片组以及IO设备等加入专门针对虚拟化的支持,从而高容易、高效的实现虚拟化。
(三)虚拟化技术的优势
1.更高的资源利用率——虚拟可支持实现物理资源和资源池的动态共享,提高资源利用率,特别是针对那些平均需求远低于需要为其提供专用资源的不同负载。
2.降低管理成本——虚拟可通过以下途径提高工作人员的效率:减少必须进行管理的物理资源的数量;隐藏物理资源的部分复杂性;通过实现自动化、获得更好的信息和实现中央管理来简化公共管理任务;实现负载管理自动化。另外,虚拟还可以支持在多个平台上使用公共的工具。
3.提高使用灵活性——通过虚拟可实现动态的资源部署和重配置,满足不断变化的业务需求。
4.提高安全性——虚拟可实现较简单的共享机制无法实现的隔离和划分,这些特性可实现对数据和服务进行可控和安全的访问。
5.更高的可用性——虚拟可在不影响用户的情况下对物理资源进行删除、升级或改变。
6.更高的可扩展性——根据不同的产品,资源分区和汇聚可支持实现比个体物理资源小得多或大得多的虚拟资源,这意味着您可以在不改变物理资源配置的情况下进行规模调整。
7.互操作性和投资保护——虚拟资源可提供底层物理资源无法提供的与各种接口和协议的兼容性。
8.改进资源供应——与个体物理资源单位相比,虚拟能够以更小的单位进行资源分配。
容器
Docker 使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于 操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。
(一)容器的概念
一般来说,虚拟机都会有自己的kernel,自己的硬件,这样虚拟机启动的时候需要先做开机自检,启动kernel,启动用户进程等一系列行为,虽然现在电脑运行速度挺快,但是这一系列检查做下来,也要几十秒,也就是虚拟机需要几十秒来启动。
重新来理解虚拟机的概念,计算机科学家发现其实我们创建虚拟机也不一定需要模拟硬件的输入和输出,假如宿主机和虚拟机他们的kernel是一致的,就不用做硬件输入输出的搬运工了,只需要做kernel输入输出的搬运工即可,为了有别于硬件层面的虚拟机,这种虚拟机被命名为 操作系统层虚拟化:Operating-system-level virtualization也被叫做容器。
让我们来回顾虚拟机的概念,在虚拟机的系统中,虚拟机认为自己有独立的文件系统,进程系统,内存系统,等等一系列,所以为了让容器接近虚拟机,也需要有独立的文件系统,进程系统,内存系统,等等一系列,为了达成这一目的,主机系统采用的办法是:只要隔离容器不让它看到主机的文件系统,进程系统,内存系统,等等一系列,那么容器系统就是一个接近虚拟机的玩意了。
(二)容器框架
Docker使用一个客户端服务器架构。Docker客户端和Docker守护进程交流,Docker守护进程做非常重要的工作,构建,运行和分发你的Docker容器。Docker客户端和守护进程可以运行在同样的系统上,或者是你可以连接一个Docker客户端到一个远程Docker守护进程中。Docker客户端和守护进程通过sockets或通过RESTful API进行沟通交流。
(三)容器内部
要理解 Docker 内部构建,需要理解以下三种部件:
Docker 镜像 - Docker images
Docker 仓库 - Docker registeries
Docker 容器 - Docker containers
1.Docker 镜像
Docker 镜像是 Docker 容器运行时的只读模板,每一个镜像由一系列的层 (layers) 组成。Docker 使用 UnionFS 来将这些层联合到单独的镜像中。UnionFS 允许独立文件系统中的文件和文件夹(称之为分支)被透明覆盖,形成一个单独连贯的文件系统。正因为有了这些层的存在,Docker 是如此的轻量。当你改变了一个 Docker 镜像,比如升级到某个程序到新的版本,一个新的层会被创建。因此,不用替换整个原先的镜像或者重新建立(在使用虚拟机的时候你可能会这么做),只是一个新的层被添加或升级了。现在你不用重新发布整个镜像,只需要升级,层使得分发 Docker 镜像变得简单和快速。
2.Docker 仓库
Docker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。同样的,Docker 仓库也有公有和私有的概念。公有的 Docker 仓库名字是 Docker Hub。Docker Hub 提供了庞大的镜像集合供使用。这些镜像可以是自己创建,或者在别人的镜像基础上创建。Docker 仓库是 Docker 的分发部分。
3.Docker 容器
Docker 容器和文件夹很类似,一个Docker容器包含了所有的某个应用运行所需要的环境。每一个 Docker 容器都是从 Docker 镜像创建的。Docker 容器可以运行、开始、停止、移动和删除。每一个 Docker 容器都是独立和安全的应用平台,Docker 容器是 Docker 的运行部分。
(四)为什么使用容器
1.更高效的利用系统资源
2.更快速的启动时间
3.一致的运行环境
开发过程中一个常见的问题是环境一致性问题。由于开发环境、测试环境、生产环境不一致,导致有些 bug 并未在开发过程中被发现。而 Docker 的镜像提供了除内核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现这类问题。
4.持续交付和部署
5.更轻松的迁移
6.更轻松的维护和扩展
(五)容器与传统虚拟机比较
传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程;而容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟。因此容器要比传统虚拟机更为轻便。
参考文章:
物理机、虚拟机、容器的比较(一)
物理机、虚拟机、容器的比较(二)