目录
- 虚拟化概念
- 虚拟化分类
- 虚拟化过程
- 虚拟化技术
- Hypervisor技术
- 容器技术
- Docker
- 微服务
虚拟化概念
世界上大部分计算机处于资源浪费状态,这里的资源指的是组成计算机的各种硬件设备,比如cpu,内存,硬盘等。试想我们每天使用电脑的场景,只是简单地上上网,聊聊天,处理一些office文档,用ps画个图,用ide写个代码,而这些简单的工作远远没有发挥出一台计算机该有的性能。如果有一种技术,能够对我们的硬件资源充分地利用,本来需要两台计算机完成的工作由一台计算机来完成,并且能够为我们节约成本,那将是一件多么美好的事情,虚拟化技术就是在这种千呼万唤中产生了。
记的最早接触虚拟化技术是很多年前,当时在一家公司做移动端开发,每个前端的开发机是一台windows电脑,后来因为业务的需要,需要在苹果生态下调试应用,我们知道苹果生态的应用只能在mac环境下开发,理论上公司应该再给开发人员配一台mac电脑,但公司为了节约成本,想出了一个很挫的办法,要求每个前端人员在自己的windows电脑上安装黑苹果,装完之后搞得每个人的机器都很卡,但至少解决了问题。当年折腾黑苹果的经历直到现在我还记忆犹新,先是下载VMware和mac系统镜像,然后在VMware中配置cpu用几核,用多大的内存和硬盘,然后安装mac镜像和硬件驱动,后来虽然跑起来,但机器卡的要死。当时并没有对虚拟机做进一步的探究。直到多年后的今天在研究这门技术的时候才意外地发现,当时使用的虚拟机就是一种虚拟化技术。
再比如我们的产品上线,免不了会遇到从第三方租用服务器的情况,虽然我们可能对服务器的配置要求是双核cpu/2G内存/20G硬盘,但提供商不可能去给我们攒一台一模一样的机器出来,而是将现有的比如8核cpu/16G内存/100G硬盘的计算机,通过虚拟化技术,虚拟出我们需要的资源,剩下的资源提供给其它客户使用,也就是一台服务器有可能服务于多个客户。
通过上面的两个例子可以看到虚拟化解决的是硬件资源冗余问题,也就是怎么能提高硬件资源的利用率。
虚拟化分类
- 平台虚拟化(Platform Virtualization):针对计算机和操作系统的虚拟化。
- 资源虚拟化(Resource Virtualization):针对特定的系统资源的虚拟化,如内存、存储、网络资源等。
- 应用程序虚拟化(Application Virtualization):包括仿真、模拟、解释技术等,如 Java 虚拟机(JVM)。
虚拟化过程
虚拟化的过程包括硬件虚拟和软件虚拟。一台计算机之所以能够跑起来,是因为有cpu、内存、硬盘,网络这些硬件基础。虚拟化技术实际上是在当前计算机系统模拟另外一套计算机系统。既然要虚拟出另外一台计算机,那么就要虚拟出计算机的这些组成部分。我们知道计算机由硬件和软件组成,那么不但要虚拟出像cpu、内存、硬盘、网络这样的硬件资源,还要虚拟出操作系统与应用软件,在这一切工作完成后虚拟化的计算机才能真正跑起来。
虚拟化技术
目前市面上主流的虚拟化技术有两个,一个是Hypervisor或称为 VMM(Virtual Machine Monitor),另一个是容器技术。在讲这两个概念之前,我们先来看两张图,这两张图让人感到震惊的地方是,平台虚拟化的两种雏形竟然在1974年就被提出来了,它们一个用在虚拟机上,一个用在容器技术上,而且一直沿用至今。
这两种技术最大的区别是,在Hypervisor虚拟化环境当中每台虚拟机都需要使用独立的操作系统,而容器只需要依赖宿主操作系统,也就是所有容器共享宿主操作系统。Hypervisor代表虚拟机,虚拟机是一个机器,但容器是一个进程。每一个虚拟机里面都有一套完整的操作系统,而容器层安装在操作系统之上,它直接利用了宿主机的内核,更加轻量化,启动速度极快。通常,我们在会每个容器里面跑单个的应用,而在虚拟机里会跑很多应用。
Hypervisor技术
提起虚拟化技术,不得不先从Hypervisor讲起,Hypervisor或称为 VMM(Virtual Machine Monitor),中文翻译过来叫虚拟机监视器。在Hypervisor技术中,每台虚拟机都需要安装独立的操作系统,其实现架构如下图所示有三种:
先看类型1,被称为裸机型,VMM直接运行在宿主机的硬件上来控制硬件和管理客户机操作系统,前提是需要硬件支持,最底层是硬件层,往上是VMM,这里的VMM既是一个操作系统,也是一个虚拟机管理程序,也就是在这种架构中操作系统和虚拟机监视器合二为一。容器化思想就采用了这种方式,像我们后面要讲的CentOS系统,就是系统原生就已经集成了虚拟化技术。
再看类型2,被称为宿主型,最底层是硬件层,往上是宿主操作系统,在宿主操作系统上运行WMM,再在VMM上运行客户端操作系统,由架构我们可以看出,VMM 作为应用程序运行在主操作系统环境内,运行时VM内核->Hypervisor->主机内核,正因为如此运行效率十分地低下,这也解决了我多年前的疑虑,为什么当时装完黑苹果系统会那么卡。
容器技术
容器其实就是一种沙盒技术,可以将应用运行在其中,与外界隔离,这个沙盒环境可以被方便地移植到其它地方。相比于Hypervisor虚拟机技术来讲有以下几个特点:
- 容器技术更加轻量级,因为它不需要安装运行容器所依赖的操作系统,启动速度更快。
- 容器之间相互隔离,互不影响。
- 每个容器内部是一整套完整的运行环境,易于移植,一次构建,随处部署。
- 部署效率高,花费时间短,在毫秒与秒之间。
简单来讲,一个容器包含了完整的运行时环境:除了应用程序本身之外,这个应用所需的全部依赖、类库、其他二进制文件、配置文件等,都统一被打入了一个称为容器镜像的包中。通过将应用程序本身,和其依赖容器化,操作系统发行版本和其他基础环境造成的差异,都被抽象掉了。这样的好处是,我们可以很容易地将镜像包在不同人员之间传递,从一个环境移植到另一个环境也显得很灵活。
Docker
Docker 是一个开源的应用容器引擎,那么虚拟化技术又跟Docker有什么关系呢?其实就一句话,Docker是容器的一种技术实现,请记住是一种实现,那么是不是还有其他实现,答案是肯定的,比如Rocket。但就Docker目前的风行程度来讲,Docker几乎成为容器技术的代名词。
正式因为Docker的出现,才把容器变得标准化了。要理解Docker,你需要明白三个最主要的概念:容器、镜像、仓库。
- 容器是运行在虚拟机上的进程。
- 镜像是一种存储形式,可以理解为数据或应用的副本。
- 仓库是用来存储镜像的。
从Docker的几个常用命令我们来看一下Docker能做什么:
##列出本地images
docker images
##搜索仓库MySQL镜像
docker search mysql
##下载Redis官方最新镜像
docker pull redis
##单个镜像删除,相当于
docker rmi redis
##构建docker镜像
docker build -f /docker/dockerfile/mycentos -t mycentos:1.1
##新建并启动容器
docker run -i -t --name mycentos
##列出redis容器中运行进程
docker top redis
##查看redis容器日志,默认参数
docker logs rabbitmq
##使用run方式在创建时进入
docker run -it centos /bin/bash
##将rabbitmq容器中的文件copy至本地路径
docker cp rabbitmq:/[container_path] [local_path]
从上面的几个命令我们可以发现,Docker用来负责虚拟硬件资源,管理镜像和容器,并负责与宿主计算机通讯。
微服务
什么是微服务呢,简单来说就是把系统拆的更小,粒度更细,只要该系统依赖的资源与其他系统都没有关系,那么就可以拆分为一个微服务。比如我们以前总是把用户信息和用户资产存到以数据库中,如果使用微服务的概念,就应该把这两块内容拆分成不同的模块,并且两个模块之间没有任何的依赖,谁离了谁都能够独立存在。如果需要用户信息直接去用户信息服务拉取,而需要用户资产信息就去资产服务拉取,我认为微服务首先要满足以下两个要求:
- 一个微服务应该都是单一职责的,一个微服务解决一个业务问题。
- 将自己的业务能力封装并对外提供服务。