docker笔记01:docker预备知识

1. 虚拟化

1.1 虚拟化概念

虚拟化,是指通过虚拟化技术将一台计算机虚拟为多台逻辑计算机。在一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且应用程序都可以在相互独立的空间内运行而互不影响,从而显著提高计算机的工作效率。

虚拟化使用软件的方法重新定义划分IT资源,可以实现IT资源的动态分配、灵活调度、跨域共享,提高IT资源利用率,使IT资源能够真正成为社会基础设施,服务于各行各业中灵活多变的应用需求。

虚拟化的主要目的是对IT基础设施进行简化。它可以简化对资源以及对资源管理的访问。
消费者可以是一名最终用户、应用程序、访问资源或与资源进行交互的服务。

资源是一个提供一定功能的实现,它可以基于标准的接口接受输入和提供输出。资源可以是硬件,例如服务器、磁盘、网络、仪器;也可以是软件,例如Web 服务。

虚拟化支持的操作系统有:Windows和Linux各种系统。

1.2 虚拟化类型

参考:http://virtual.51cto.com/art/201803/569228.htm

从虚拟化的层次划分,主要分为软件辅助的虚拟化和硬件辅助的虚拟化。

(1)软件辅助虚拟化:通过软件的方法,让客户机的特权指令陷入异常,从而触发宿主机进行虚拟化。主要使用的技术就是优先级压缩和二进制代码翻译。

(2)硬件辅助虚拟化:是指在 CPU 中加入新的指令集和处理器运行模式,完成虚拟化操作系统对硬件资源的的直接调用。典型技术指的是 Intel VT,AMD-V。

从虚拟平台角度分为全虚拟化和半虚拟化。

(1)全虚拟化(Full Virtualization):全虚拟化是指虚拟机模拟了完整的底层硬件,包括处理器、物理内存、时钟、外设等,使得为原始硬件设计的操作系统或其它系统软件完全不做任何修改就可以在虚拟机中运行。操作系统与真实硬件之间的交互可以看成是通过一个预先规定的硬件接口进行的。全虚拟化 VMM 以完整模拟硬件的方式提供全部接口(同时还必须模拟特权指令的执行过程)。

全虚拟化不需要更改 Guest OS,兼容性好。典型的代表有 Vmware WorkStation,ESX Server 早期版本,Microsoft Virtrual Server。

(2)半虚拟化(Paravirtualization):半虚拟化通过修改 Guest OS 部分访问特权状态的代码以便直接与 VMM 直接交互。在半虚拟化虚拟机中,部分硬件接口以软件的形式提供给客户机操作系统,这可以通过 Hypercall(VMM 提供给 Guest OS 的直接调用,与系统调用类似)的方式来提供,所以也被称为超虚拟化。

例如,Guest OS 把切换页表的代码修改为调用 Hypercall 来直接完成修改影子 CR3 寄存器和翻译地址的工作。

依靠这些指令可以直接通过 Hypervisor 层调用硬件资源,从而免除了 Hypervisor 层转换指令的开销,由于不需要产生额外的异常和模拟部分硬件执行流程,半虚拟化可以大幅度提高性能,半虚拟化的典型代表有 Microsoft Hyper-V,Vmware 的 vSphere。

(3)硬件辅助虚拟化(Hardware-Assisted Virtualization) :指借助硬件(主要是主机处理器)的支持来实现高效的全虚拟化。例如有了 Intel-VT 技术的支持,Guest OS 和 VMM 的执行环境自动地完全隔离开来,Guest OS 有自己的“全套寄存器”,可以直接运行在最高级别。因此在上面的例子中,Guest OS 能够执行修改页表的汇编指令。Intel-VT 和 AMD-V 是目前 x86 体系结构上可用的两种硬件辅助虚拟化技术。

从虚拟化 VMM 的实现结构来看,可以分为裸金属虚拟化,宿主型虚拟化和混合虚拟化,接下来咱们分别详细介绍一下。

(1)裸金属型虚拟化(也叫 Hypervisor 虚拟化、裸机或 I 型):指直接在底层硬件上安装VMM 作为 Hypervisor 接管,Hypervisor 将负责管理所有的资源和虚拟环境支持。

该模型中,VMM 可以看作一个为虚拟化而生的完整的操作系统,掌控有所有资源(CPU,内存,I/O 设备)。VMM 承担管理资源的重任,其还需向上提供 VM 用于运行 Guest OS,因此 VMM 还负责虚拟环境的创建和管理。

它主要实现两个基本功能,其一是识别、捕获和响应虚拟机所发出的 CPU 特权指令或保护指令;其二是负责处理虚拟机队列和调度,并将物理硬件的处理结果返回给相应的虚拟机。这种结构问题是,硬件设备多种多样,VMM 不能把所有的设备驱动都一一实现,所以此模型支持有限的设备。如下图所示:
docker笔记01:docker预备知识
优点:因 VMM 同时具有物理资源的管理功能和虚拟化功能,故虚拟化的效率会较高;安全性方面,VM 的安全只依赖于 VMM 的安全。

缺点:因 VMM 完全拥有物理资源,因此,VMM 需要进行物理资源的管理,包括设备的驱动,而设备驱动的开发工作量是很大的,这对 VMM 是个很大的挑战。

采用该结构的 VMM 有:VMWare ESX Server, WindRiver Hypervisor, KVM(后期)。

(2)宿主模型虚拟化(OS-hosted,也叫寄居虚拟化或 II 型):此模型的物理资源由 Host OS(例如 Windows, Linux etc.)管理,实际的虚拟化功能由 VMM 提供,其通常是 Host OS 的独立内核模块(有的实现还含用户进程,如负责 I/O 虚拟化的用户态设备模型)。VMM 通过调用 Host OS 的服务来获得资源,实现 CPU,内存和 I/O 设备的虚拟化。VMM 创建出 VM 后,通常将 VM 作为 Host OS 的一个进程参与调度。如下图所示:
docker笔记01:docker预备知识
如上图所示,VMM 模块负责 CPU 和内存虚拟化,由 ULM 请求 Host OS 设备驱动,实现 I/O 设备的虚拟化。

优点:可以充分利用现有 OS 的设备驱动,VMM 无需自己实现大量的设备驱动,轻松实现 I/O 设备的虚拟化。

缺点:因资源受 Host OS 控制,VMM 需调用 Host OS 的服务来获取资源进行虚拟化,其效率和功能会受到一定影响。

采用该结构的 VMM 有:VMware Workstation,VMWare Server (GSX),Virtual PC,Virtual Server,KVM(早期)。

(3)混合模型虚拟化(Hybrid,也叫操作系统虚拟化或容器型):就是以上两种模型的混合,这种模型没有独立的 Hypervisor 层。相反,主机操作系统本身就负责在多个虚拟服务器之间分配硬件资源,并且让这些服务器彼此独立。

如果使用操作系统层虚拟化,所有虚拟服务器必须运行同一操作系统(不过每个实例有各自的应用程序和用户账户),虚拟机运行在传统操作系统上,创建一个独立的虚拟化实例,指向底层托管操作系统,VMM 直接管理硬件,但是会让出一定的设备的控制权,交给运行在特权上的虚拟机来管理。VMM 只负责 CPU 和内存的虚拟化,I/O 设备的虚拟化由 VMM 和特权 OS 共同完成。
docker笔记01:docker预备知识
优点:可利用现有 OS 的 I/O 设备驱动;VMM 直接控制 CPU 和内存等物理资源,虚拟化效率较高;若对特权 OS 的权限控制得当,虚拟机的安全性只依赖于 VMM。

缺点:因特权 OS 运行于 VM 上,当需要特权 OS 提供服务时,VMM 需要切换到特权 OS,这里面就产生上下文切换的开销和性能降低。

采用该结构的 VMM 有:Xen,SUN Logical Domain。

从虚拟化在云计算的应用领域进行划分,可分为服务器虚拟化(即计算虚拟化),网络虚拟化,存储虚拟化,应用程序虚拟化,平台虚拟化,桌面虚拟化。

(1)服务器虚拟化:就是将一台服务器虚拟成多台服务器进行使用,服务器虚拟化是基础架构即服务(IaaS)的基础。

(2)网络虚拟化:笼统来讲,包括VLAN、v*n、VPLS、MPLS、LISP、Virtual routers、VRFs 等在内的都可以认为是网络虚拟化的某种表现形式。但当前新兴的网络虚拟化概念从深度、广度和影响上都远远超过了以上的技术。网络虚拟化简单说就是把网络层的一些功能从硬件中剥离出来,新建立所谓的网络虚拟层。

(3)存储虚拟化:简单来说就是将整个云系统的存储资源进行统一整合管理,再为不同用户分配各自的存储空间。

(4)应用程序虚拟化:简单来说就是把应用程序对底层硬件系统和硬件的依赖抽象出来,从而解除应用程序与 OS 和硬件的耦合关系。应用程序运行在本地应用的虚拟化环境中,这个环境为应用程序屏蔽了底层可能和其他应用产生冲突的内容。应用程序虚拟化是(SaaS)的基础。

(5)平台虚拟化:是集成各种开发资源虚拟出的一个面向开发人员的统一接口,软件开发人员可以方便的在这个平台上开发各种应用并嵌入云计算中,使其成为新的云服务供给用户使用。

(6)桌面虚拟化:将用户的桌面环境与其使用的终端设备进行解耦。服务器上的存放每个人的完整桌面环境。用户可以使用具有足够处理功能和显示功能的不同终端设备通过网络访问该桌面。

2. 云计算的分类

  1. IAAS: 用户通过Internet 可以从完善的计算机基础设施获得服务。这类服务可以称为基础设施即服务。
  2. PAAS:提供了用户可以访问的完整或部分的应用程序开发,这类服务可以称为平台即服务。
  3. SAAS:提供了用户可以访问的完整的可直接使用的应用程序,这类服务可以称为软件即服务。

如果把他们看作层次结构,那么第一层自然叫做IAAS,第二层就是PAAS,第三层也就是SAAS。

下面简单举一个例子:吃货如何吃到披萨。

  • 方式一:自己在家做(本地部署On-Premises
  • 方式二:买好速食披萨回家自己做着吃(基础设施即服务-IAAS
  • 方式三:打电话叫外卖将披萨送到家中(平台即服务-PAAS
  • 方式四:直接在披萨店吃披萨(软件即服务-SAAS

现在我们从披萨中回到云计算的概念来。假设你是一家超级牛逼的技术公司,根本不需要别人提供服务,你拥有基础设施、应用等等其它一切,你把它们分为三层:基础设施(infrastructure)、平台(platform)和软件(software)。这其实就是云计算的三个分层,基础设施在最下端,平台在中间,软件在顶端,分别是Infrastructure-as-a-Service(IAAS)Platform-as-a-Service(PAAS)Software-as-a-Service(SAAS)

如果你的公司什么都有,现在所处的状态叫本地部署(On-Premises),就像在自己家做披萨一样。如果你想在办公室或者公司的网站上运行一些企业应用,你需要去买服务器,或者别的高昂的硬件来控制本地应用,让你的业务运行起来,这就叫本地部署。

假如你突然有一天想明白了,只是为了吃上披萨,为什么非要自己做呢?于是,准备考虑一家云服务供应商,这个云服务供应商能提供哪些服务呢?其所能提供的云服务也就是云计算的三个分层:PAAS、IAAS和SAAS,就像披萨店提供三种服务:买成品回家做、外卖和到披萨店吃

参考:
https://blog.****.net/qq_29229567/article/details/79246851
http://cloud.51cto.com/art/201802/565858.htm

IAAS:公共的和私有的。Amazon EC2在基础设施云中使用公共服务器池。更加私有化的服务会使用企业内部数据中心的一组公用或私有服务器池。如果在企业数据中心环境中开发软件,那么这两种类型都能使用,而且使用EC2临时扩展资源的成本也很低,比方说测试,结合使用两者可以更快地开发应用程序和服务,缩短开发和测试周期。
一些大的IAAS公司包括Amazon, Microsoft, VMWare, Rackspace和Red Hat.不过这些公司又都有自己的专长,比如Amazon和微软给你提供的不只是IAAS,他们还会将其计算能力出租给你来host你的网站。Openstack做的就是IAAS平台。

PAAS:Platform-as-a-Service(平台即服务),第二层就是所谓的PAAS,某些时候也叫做中间件。你公司所有的开发都可以在这一层进行,节省了时间和资源。PAAS公司在网上提供各种开发和分发应用的解决方案,比如虚拟服务器和操作系统。这节省了你在硬件上的费用,也让分散的工作室之间的合作变得更加容易。网页应用管理,应用设计,应用虚拟主机,存储,安全以及应用开发协作工具等。一些大的PAAS提供者有Google App Engine,Microsoft Azure,Force.com,Heroku,Engine Yard。最近兴起的公司有AppFog,Mendix和Standing Cloud。docker做的就是PAAS平台

SAAS:Software-as-a-Service(软件即服务),第三层也就是所谓SAAS。这一层是和你的生活每天接触的一层,大多是通过网页浏览器来接入。任何一个远程服务器上的应用都可以通过网络来运行,就是SAAS了。你消费的服务完全是从网页如Netflix,MOG,Google Apps,Box.net,Dropbox或者苹果的iCloud那里进入这些分类。尽管这些网页服务是用作商务和娱乐或者两者都有,但这也算是云技术的一部分。一些用作商务的SaaS应用包括Citrix的Go To Meeting,Cisco的WebEx,Salesforce的CRM,ADP,Workday和SuccessFactors。

3. 名词解释

KVM:

KVM是linux内核的模块,它需要CPU的支持,采用硬件辅助虚拟化技术Intel-VT,AMD-V,内存的相关如Intel的EPT和AMD的RVI技术,Guest OS的CPU指令不用再经过Qemu转译,直接运行,大大提高了速度,KVM通过/dev/kvm暴露接口,用户态程序可以通过ioctl函数来访问这个接口。

QEMU:

Qemu是一个模拟器,它向Guest OS模拟CPU和其他硬件,Guest OS认为自己和硬件直接打交道,其实是同Qemu模拟出来的硬件打交道,Qemu将这些指令转译给真正的硬件。
docker笔记01:docker预备知识
由于所有的指令都要从Qemu里面过一手,因而性能较差。

QEMU-KVM:

Qemu将KVM整合进来,通过ioctl调用/dev/kvm接口,将有关CPU指令的部分交由内核模块来做。kvm负责cpu虚拟化+内存虚拟化,实现了cpu和内存的虚拟化,但kvm不能模拟其他设备。qemu模拟IO设备(网卡,磁盘等),kvm加上qemu之后就能实现真正意义上服务器虚拟化。因为用到了上面两个东西,所以称之为qemu-kvm。
docker笔记01:docker预备知识
Qemu模拟其他的硬件,如Network, Disk,同样会影响这些设备的性能,于是又产生了pass through半虚拟化设备virtio_blk, virtio_net,提高设备性能。

libvirt:

libvirt是目前使用最为广泛的对KVM虚拟机进行管理的工具和API。Libvirtd是一个daemon进程,可以被本地的virsh调用,也可以被远程的virsh调用,Libvirtd调用qemu-kvm操作虚拟机。
docker笔记01:docker预备知识

参考:https://www.cnblogs.com/qiaoyanlin/p/6888408.html

openstack

OpenStack是一个由NASA(美国国家航空航天局)和Rackspace合作研发并发起的,以Apache许可证授权的自由软件和开放源代码项目。
OpenStack是一个开源的云计算管理平台项目,由几个主要的组件组合起来完成具体工作。OpenStack支持几乎所有类型的云环境,项目目标是提供实施简单、可大规模扩展、丰富、标准统一的云计算管理平台。OpenStack通过各种互补的服务提供了基础设施即服务(IaaS)的解决方案,每个服务提供API以进行集成。
OpenStack主要用于企业部署私有云上。

Openstack与KVM

OpenStack几乎支持所有的虚拟化管理程序,不论是开源的(Xen与KVM)还是厂商的(Hyper-V与VMware)。但在以前,OpenStack是基于KVM开发的,KVM常常成为默认的虚拟机管理程序。两者都使用相同的开放源理念与开发方法。

QEMU-KVM就是一个完整的模拟器,它是构建基于KVM上面的,它提供了完整的网络和I/O支持。

Openstack不会直接控制qemu-kvm,它会用一个叫libvirt的库去间接控制qemu-kvm。libvirt提供了跨VM平台的功能,它可以控制除了QEMU之外的模拟器,包括vmware, virtualbox, xen等等。

所以为了openstack的跨VM性,只会用libvirt而不直接用qemu-kvm。libvirt还提供了一些高级的功能,例如pool/vol管理。

XEN

Xen是第一类运行在裸机上的虚拟化管理程序(Hypervisor)。它支持全虚拟化和半虚拟化,Xen支持hypervisor和虚拟机互相通讯,而且提供在所有Linux版本上的免费产品,包括Red Hat Enterprise Linux和SUSE Linux Enterprise Server。Xen最重要的优势在于半虚拟化,此外未经修改的操作系统也可以直接在xen上运行(如Windows),能让虚拟机有效运行而不需要仿真,因此虚拟机能感知到hypervisor,而不需要模拟虚拟硬件,从而能实现高性能。

LXC

LXC是LinuX Container的简称,提供轻量级的虚拟化,是一种基于容器的操作系统层级的虚拟化技术。利用新版Linux内核的特性(Cgroups等)实现的无需hypervisor的轻型虚拟化技术。容器能有效的将由单个操作系统管理的资源划分到孤立的组中,以更好地在孤立的组之间平衡有冲突的资源使用需求。

LXC能够虚拟出一个完整的系统环境(rootfs),也可以仅为单个或多个应用程序提供虚拟化运行环境。从使用方式来看,它更像是增强版的chroot环境,提供一个拥有自己进程、网络空间的虚拟环境。

docker与lxc

Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。
在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。
LXC的特点需要通过Docker团队来重载实现,使之在Docker中可用,比如LXC现在支持让非根用户创建和配置容器的未经授权容器,LXC现在还致力于实时迁移和多主机管理。这些对容器来说都是很大的进步,也为更好的安全性,多租户工作量以及虚拟平价铺平了道路。Docker还不支持这些。随着最近的libcontainer声明,推测两者间的差距还将增大。

参考:
1. 如何理解LXC与Docker之间的主要区别
2. 炒个冷饭LXC,试问Docker你凭啥这么火?
3. Docker vs KVM,Docker是否能取代VM虚拟机

4. docker

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。
一个完整的Docker有以下几个部分组成:

  • dockerClient客户端
  • Docker Daemon守护进程
  • Docker Image镜像
  • DockerContainer容器

4.1 docker的特性:

在docker的网站上提到了docker的典型场景:

  • Automating the packaging and deployment of applications(使应用的打包与部署自动化)
  • Creation of lightweight, private PAAS environments(创建轻量、私密的PAAS环境)
  • Automated testing and continuous integration/deployment(实现自动化测试和持续的集成/部署)
  • Deploying and scaling web apps, databases and backend services(部署与扩展webapp、数据库和后台服务)

由于其基于LXC的轻量级虚拟化的特点,docker相比KVM之类最明显的特点就是启动快,资源占用小。因此对于构建隔离的标准化的运行环境,轻量级的PaaS(如dokku),构建自动化测试和持续集成环境,以及一切可以横向扩展的应用(尤其是需要快速启停来应对峰谷的web应用)。

  1. 构建标准化的运行环境,现有的方案大多是在一个baseOS上运行一套puppet/chef,或者一个image文件,其缺点是前者需要base OS许多前提条件,后者几乎不可以修改(因为copy on write 的文件格式在运行时rootfs是read only的)。并且后者文件体积大,环境管理和版本控制本身也是一个问题

  2. PaaS环境是不言而喻的,其设计之初和dotcloud的案例都是将其作为PaaS产品的环境基础。

  3. 因为其标准化构建方法(buildfile)和良好的REST API,自动化测试和持续集成/部署能够很好的集成进来
  4. 因为LXC轻量级的特点,其启动快,而且docker能够只加载每个container变化的部分,这样资源占用小,能够在单机环境下与KVM之类的虚拟化方案相比能够更加快速和占用更少资源

4.2 docker的局限:

Docker并不是全能的,设计之初也不是KVM之类虚拟化手段的替代品,简单总结几点:

  1. Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用
  2. LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base的。
  3. 隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库。
  4. 网络管理相对简单,主要是基于namespace隔离
  5. cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(所以dotcloud主要是按内存收费)
  6. Docker对disk的管理比较有限
  7. container随着用户进程的停止而销毁,container中的log等用户数据不便收集