Docker学习2-虚拟化
虚拟化就是由位于下层的软件模块,根据上层的软件模块的期待,抽象(虚拟)出一个虚拟的软件或硬件模块,使上一层软件直接运行在这个与自己期待完全一致的虚拟环境上。从这个意义上来看,虚拟化既可以是软件层的抽象,又可以是硬件层的抽象。
Virtual Machine Monitor VMM,即虚拟机监控系统,也叫 Hypervisor,是虚拟化层的具体实现。主要是以软件的方式实现一套和物理主机环境完全一样的虚拟环境,物理主机有的所有资源,包括 CPU、内存、网络 IO、设备 IO等等,它都有。相当于 VMM 对物理主机的资源进行划分和隔离,使其可以充分利用资源供上层使用。虚拟出的资源以虚拟机的形式提供服务,一个虚拟机本质上和一台物理机没有什么区别,可以跑各种操作系统,在之上再跑各种应用。
虚拟机通常叫做客户机(guest),物理机叫宿主机(host),VMM 处在中间层,既要负责对虚拟资源的管理,包括虚拟环境的调度,虚拟机之间的通信以及虚拟机的管理等,又要负责物理资源的管理,包括处理器、中断、内存、设备等的管理,此外,还要提供一些附加功能,包括定时器、安全机制、电源管理等。
Virtual Machine Monitor VMM根据平台类型和实现结构有两种不同的分类,按平台类型可以分为完全虚拟化和类虚拟化,完全虚拟化就是 VMM 完全模拟出一个跟物理主机完全一样的环境。但是这个是非常困难的,首先,这需要硬件的支持,而硬件在初期设计的时候,没有那么远的前瞻性,可以预想到为虚拟化提供支持,前次,指令的复杂性,即使通过模拟的方式也很难做到全部指令都模拟。所以,就需要借助其他的一些技术来辅助虚拟化。
软件辅助虚拟化通过优先级压缩(Ring Compression,RC)和二进制代码转译(Binary Translation,BT)来完成。RC 基于 CPU 特权级原理,也就是guest、VMM 和 host 分别处于不同的特权级上,guest 要访问 host 属于越级访问就会抛异常,VMM会截获异常,并模拟出其可能的行为,从而进行相应处理。但是由于硬件设计的缺陷,有些指令并不能被截获,从而导致“漏洞”(即指令不能转为支持虚拟化的指令)。BT可以弥补这个缺陷,通过扫描guest的二进制的代码,将难以虚拟化的指令转为支持虚拟化的指令,从而可以配合VMM 完成虚拟化功能。优先级压缩(Ring Compression,RC)和二进制代码转译(Binary Translation,BT)这两种方式都是通过「打补丁」的方式来辅助虚拟化,因此,很难在架构上保证完整性。后期的硬件厂商在硬件上对虚拟化提供了支持,即硬件辅助的虚拟化。通过对硬件本身加入更多的虚拟化功能,就可以截获更多的敏感指令,填补上漏洞。
类虚拟化是外一种通过软件来避免漏洞的方式,通过修改客户机 Guest操作系统内核代码(API级)来避免漏洞,因此,可以自定义内核的执行行为,某种程度上对性能进行优化。
根据Virtual Machine Monitor VMM的实现结构分类,主要分Hypervisor 模型(I 型)和宿主模型(II 型)两类。
Hypervisor 模型(I 型),也称裸机型:
直接安装在硬件计算资源上,操作系统安装并且运行在Hypervisor之上。Hypervisor 模型中 VMM 既是操作系统,又是虚拟化软件,即集成了虚拟化功能的操作系统,对上为 guest 提供虚拟化功能,对下管理着所有物理资源,它的优点是效率高,虚拟机的安全性只依赖于VMM,缺点是管理所有的物理资源,意味着 VMM 要承担很多的开发工作,特别是驱动层面的开发,硬件的 I/O 设备有很多,这些设备都需要有对应的驱动来设配才能为虚拟机提供功能。
宿主模型(II 型):
宿主模型剥离了管理功能和虚拟化功能,虚拟化功能只是作为内核的一个模块来加载,比如 Kernel Virtual Machine KVM 技术,一般 KVM 只负责 CPU 和内存的硬件虚拟化,I/O 的虚拟化则由QEMU技术来完成。2006年10月,KVM模块的源代码被正式接纳进入Linux Kernel,成为内核源代码的一部分。因此,KVM是Linux完全原生的硬件虚拟化解决方案。
KVM架构
上图中,Linux内核运行在物理硬件之上,KVM模块将Linux内核本身变成一个Hypervisor。Hypervisor是位于物理硬件和虚拟硬件之间的一个中间层,可以理解为一个代理,它将虚拟硬件要执行的指令按一定的算法调度给物理硬件去执行。有了虚拟硬件,虚拟机就可以按照正常的流程安装操作系统以及运行APP了。
Hypervisor核心工作就是对多个虚拟硬件要求的资源进行统筹协调,最主要的就是协调CPU资源和内存资源。对于CPU资源,Hypervisor通过选择合适的调度算法,把物理CPU合理的分配给虚拟CPU使用。对于内存资源,Hypervisor需要先将物理硬件的内存地址转化为虚拟硬件的物理地址,虚拟机Operating System OS会把虚拟硬件的物理地址映射为虚拟内存地址,进而提供给APP使用。KVM除了对CPU和内存资源进行管理之外,还能够使用Linux支持的任何存储形式来存储虚拟机系统盘。
Ⅲ 型:
虚拟机运行在传统操作系统上,创建一个独立的虚拟化实例(容器),指向底层托管操作系统,即操作系统虚拟化。操作系统虚拟化是在操作系统中模拟出运行应用程序的容器,所有虚拟机共享内核空间,性能最好,耗费资源最少。但是缺点是底层和上层必须使用同一种操作系统,如底层操作系统运行的是Windows系统,则VPS/VE就必须运行Windows。
云计算的本质
云服务器:位于云上的使用虚拟化技术构建出的服务器;
CSP:Cloud Service Provider;
在云计算出现之前,互联网公司是需要购买服务器、存储和网关等基础设施的。在云计算出现之后,互联网公司还是需要购买服务器、存储和网关等基础设施的。因此,互联网的基础设施并没有因为云计算的出现而改变。但是可以发现,在云计算出现以前,企业IT采购基础设施的流程至少几个月。而云计算出现之后,企业IT采购基础设施的流程可以在很短时间内完成。因此,云计算颠覆的是互联网基础设施的交付方式。这种对互联网基础设施交付方式的改变就要求,Cloud Service Provider CSP能够以一种区别于传统硬件的方式提供互联网的基础设施。于是,虚拟化技术就正式进入了历史舞台(虚拟化技术早在云计算出现之前很多年就已经存在,只不过彼时的虚拟化技术使用的场景比较有限,不被大家所关注)。
虚拟化技术(VMware、Xen、KVM等),即能够虚拟计算机硬件的技术。利用虚拟化技术虚拟出计算机必要的各个组件,再将虚拟出的组件组装起来,就得到一台虚拟的计算机(虚拟机),因此可以虚拟出千万台计算机组成云。
计算机由五大部分组成:运算器、控制器、存储器、输入设备和输出设备。其中,运算器和控制器统称为中央处理器(CPU)。存储器分为内存和外存(硬盘)。输入设备和输出设备统称外设(键盘显示器等等)
从Cloud Service Provider CSP的角度来分析其必要性。首先,CSP的客户是通过网络连接到位于云上的虚拟机(虚拟的计算机)的,为此CSP并不需要关心虚拟机外设的实现。CSP需要关心的是如何利用虚拟化技术对虚拟机的CPU、内存及外存进行实现。
把CPU和内存的虚拟化实现统称为虚拟硬件。而外存实际上就是一个特定格式的文件(vid、qcow2等等)。但是单单有外存是没有意义的,还需要给这个外存安装操作系统。把安装了操作系统的外存统称为虚拟系统盘(实际上是一个文件)。CSP要实现一台云服务器,只需要关心两个问题:如何构建虚拟硬件?如何构建虚拟系统盘?
在常见的虚拟化技术中,这两个问题都有完整的解决方案。比如QEMU/KVM能够提供一套完整的虚拟硬件系统环境,而QEMU推荐的qcow2文件可以用来构建虚拟系统盘。
任何一台云服务器都是由虚拟硬件和虚拟系统盘组成的。但是,云上有成千上万台虚拟机,它们背后对应着海量的虚拟硬件和虚拟系统盘,如何组织这些虚拟硬件和虚拟系统盘是一个值得研究和思考的课题。
为什么用docker?
在微服务的大背景下,一台物理机或者云主机可能要运行很多应用。应用必须依赖于开发环境。当我们遇到拓展物理机、云主机、应用迁移等场景,必然要重新搭建开发环境。这时,虚拟化技术就很好地保证环境一致、配置一致,并且让你更高效地迁移应用。
Docker正是应对这种场景的虚拟化技术。例如java,只要机器上安装了JVM,一份代码到处运行。应用好比java,只要机器上安装docker,我们事先保存的镜像可以到处运行。这些镜像可以是nginx、php、mysql、数据仓库等,无论你的主机从ubuntu迁移到centos,还是windows迁移linux,只要主机安装了docker,就能迅速地部署好新环境,并且保持环境、配置一致。
什么是镜像、容器、仓库?
镜像,是特殊的文件系统,他包含程序、配置、资源等;
容器,镜像的实例。就像是类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。
仓库,用于保存镜像的服务。
Docker学习2-虚拟化的更多相关文章
- Docker学习总结
本文作为总结性文章,不会详细讲解Docker.但会把已学习的.了解的内容按照由易到难的顺序串起来,更多的是帮助Docker新手快速的了解Docker,知道目前处在哪个阶段,接下来该学些什么,避免碰太多 ...
- docker学习资料整理(持续更新中..)
docker最近可以说火得一踏糊涂,跟 51大神在交流技术的时候这个东西会多次被提到,当我们还玩vm+linux/freebsd的时候,人家已经上升到更高层次了,这就是差距,感觉好高大上的样子,技术之 ...
- Docker学习笔记之一,搭建一个JAVA Tomcat运行环境
Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...
- Docker学习笔记【一】
[本篇学习笔记来源于 Docker 从入门到实践] 1.什么事Docker?[What] Docker在容器的基础上,进行了进一步的封装,从文件系统.网络互联到进程隔离等,极大的简化了容器的创建和维护 ...
- 优秀的云计算工程师需要学什么?云计算Docker学习路线
云计算工程师要学什么?随着互联网的快速发展,云计算这个词大家并不陌生,但是云计算究竟是做什么的,想要从事云计算要学习什么,很多都不知道,那么今天就给大家讲一下云计算. 云计算是基于互联网的相关服务的增 ...
- Docker学习记录--入门了解+安装
Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制, ...
- Docker学习(一): 基本概念
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...
- Docker学习系列(一):windows下安装docker(转载)
本文目录如下: windows按照docker的基本要求 具体安装步骤 开始使用 安装远程连接工具连接docker 安装中遇到的问题 Docker的更新 Docker中的jupyter windows ...
- [置顶]
Docker学习总结(7)——云端基于Docker的微服务与持续交付实践
本文根据[2016 全球运维大会•深圳站]现场演讲嘉宾分享内容整理而成 讲师简介 易立 毕业于北京大学,获得学士学位和硕士学位:目前负责阿里云容器技术相关的产品的研发工作. 加入阿里之前,曾在IBM中 ...
- DOCKER学习心得
原文:DOCKER学习心得 前言: Docker的主要学习心得来源于<docker技术入门与实战> --2019.1.1->2019.1.5 la 着重从基础部分--实例分析-- ...
随机推荐
- linux系统编程:自己动手写一个ls命令
ls用于列举目录内容,要实现这个功能,毫无疑问,需要读取目录,涉及到两个api: opendir:DIR *opendir(const char *name), 传文件名,返回一个指针,指向目录序列 ...
- 5月7日——采用第三方页面内容,但是顶部title使用自己的
---------> 由A页面进入我的页面 代码如下: (1)A页面下需要添加的代码 (2)我的页面下需要添加的代码 此处用到的语法为mui框架中的语法,可参照mui官方 ...
- JS简单验证
1.验证是否全为数字 2.验证邮箱 3验证手机号 4.验证身份证号 5.验证时间格式 下面是代码,可直接用,有注释 <html> <meta charset="utf-8& ...
- CentOS7下安装caffe(包括ffmpeg\boost\opencv)
因为有项目想采用深度学习,而caffe是深度学习框架中比较理想的一款,并且跨平台,以及可以采用python/matlab的方式进行调用等优势,所以想在服务器上安装,下面就开始了血泪史... 服务器是阿 ...
- Java Web 开发填坑记- 如何正确的下载 Eclipse
一直以来,做 Java web 开发都是用 eclipse , 可是到 eclipse 官网一看,我的天 http://www.eclipse.org/downloads/eclipse-packag ...
- gulp学习。
安装gulp 安装gulp之前必须先安装node.js,然后在命令行里输入 $ npm install gulp-cli -g (-g 表示全局安装)然后在输入$ gulp -v ,验证,安装完成后再 ...
- UNIX高级环境编程(13)信号 - 概念、signal函数、可重入函数
信号就是软中断. 信号提供了异步处理事件的一种方式.例如,用户在终端按下结束进程键,使一个进程提前终止. 1 信号的概念 每一个信号都有一个名字,它们的名字都以SIG打头.例如,每当进程调用了ab ...
- ETL技巧应用(高级应用介绍:准备区运用、 时间戳的运用、日志表的运用、使用调度)
1.1 准备区运用 a.在构建数据仓库时,数据源位于一服务器上,数据仓库在另一服务器端,数据源Server端访问频繁,并且数据量大,需要不断更新, b.建立准备区数据库: >将数据抽取到准 ...
- 如何创建只读权限oracle账户
1.创建角色 CREATE ROLE SELECT_ROLE 2.给角色分配权限 grant CREATE VIEW to SELECT_ROLE; grant CREATE SYNONYM to S ...
- windows的一些好用命令-自己总结:
在win+R运行框中: cmd:进入命令行界面 msconfig:可以查看“系统配置” msinfo32:查看系统信息 services.msc打开"服务&q ...