虚拟化与Docker介绍

一、虚拟化

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

Linux上面的两个重要的虚拟化解决方案:

  • Citrix的Xen,可以同时执行Type1和Type2型的hypervisor,Amazon的EC2就是采用Xen来进行服务器的虚拟化的。
  • Linux Kernel Virtual Machine(KVM),由RedHat 开发,集成到主线内核中去了。OpenStack默认使用kvm虚拟机。

二、KVM

1、kvm介绍
kvm 是基于虚拟化扩展(Intel VT 或者 AMD-V)的 X86 硬件的开源的 Linux 原生的全虚拟化解决方案。kvm中,虚拟机被实现为常规的Linux进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 进程。这使得 kvm 能够使用 Linux 内核的已有功能。
但是,kvm 本身不执行任何硬件模拟,需要客户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的 I/O,并将它的视频显示映射回宿主的显示屏。目前这个应用程序是 QEMU。
虚拟化与Docker介绍

2、hypervisor
虚拟化是通过某种方式隐藏底层物理硬件的过程,从而让多个操作系统可以透明地使用和共享它。这种架构的另一个更常见的名称是平台虚拟化。在典型的分层架构中,提供平台虚拟化的层称为 hypervisor (有时称为虚拟机管理程序 或 VMM)
hypervisor是一种运行在物理服务器和操作系统之间的中间层软件,可以允许多个操作系统和应用共享一套基础物理硬件。
hypervisor 之于操作系统类似于操作系统之于进程。它们为执行提供独立的虚拟硬件平台,而虚拟硬件平台反过来又提供对底层机器的虚拟的完整访问。
虚拟化与Docker介绍

3、kvm-qemu介绍
qemu 原本不是 kvm 的一部分,它自己就是一个纯软件实现的虚拟化系统,所以其性能低下。但是,QEMU 代码中包含整套的虚拟机实现,包括处理器虚拟化,内存虚拟化,以及 KVM需要使用到的虚拟设备模拟(网卡、显卡、存储控制器和硬盘等)。
为了简化代码,KVM 在 QEMU 的基础上做了修改。VM 运行期间,QEMU 会通过 KVM 模块提供的系统调用进入内核,由 KVM 负责将虚拟机置于处理的特殊模式运行。遇到虚机进行 I/O 操作,KVM 会从上次的系统调用出口处返回 QEMU,由 QEMU 来负责解析和模拟这些设备。
从 QEMU 的角度看,也可以说是 QEMU 使用了 KVM 模块的虚拟化功能,为自己的虚机提供了硬件虚拟化加速。除此以外,虚机的配置和创建、虚机运行说依赖的虚拟设备、虚机运行时的用户环境和交互,以及一些虚机的特定技术比如动态迁移,都是 QEMU 自己实现的。
简单点说,qemu本身是一种虚拟软件,qemu-kvm就是一种用户态的软件,而kvm是一种内核态的。qemu帮kvm模拟了计算机上的网络、磁盘等设备。
虚拟化与Docker介绍

4、Libvirt
Libvirt是用于管理虚拟化平台的开源的API,后台程序和管理工具。它可以用于管理KVM、Xen、VMware ESX、QEMU和其他虚拟化技术。这些API在云计算的解决方案中广泛使用。
libvirt是提供了一个方便的方式来管理虚拟机和其他虚拟化功能的软件的集合,如存储和网络接口管理。这些软件包括一个API库,一个守护进程(Libvirtd),和一个命令行实用程序(virsh)。
libvirt的首要目标是能够管理多个不同的虚拟化供应商/虚拟机管理程序提供一个单一的方式。例如,命令“virsh列表等等都可以用于任何支持现有的虚拟机管理程序列表(KVM、Xen、VMware ESX,等)不需要学习管理程序特定的工具!
(1)如果libvirtd服务停用了,会影响命令行管理虚拟机,但不会影响虚拟机本身的运行。
(2)kvm是为openstack进行创建虚拟机,如果openstack服务停用,可以使用libvirtd服务命令行进行管理。

三、Docker

1、Docker介绍
Docker是PaaS供应商dotCloud开源的一个基于LXC 的高级容器引擎,源代码托管在
GitHub 上, 基于Go语言开发并遵从Apache 2.0协议开源.Docker 是通过内核虚拟化技术
来提供容器的资源,隔离与安全保证等。由于docker通过操作系统层的虚拟化实现隔离,所以Docker容器在运行时,不需要额外的虚拟化管理程序(VMM(Virtual Machine Monitor),以及hyperisor支持,他是内核级虚拟化,可以实现更高的性能,同时对资源的额外需求
很低。最本质特征docker是通过隔离来进行创建容器,而KVM等均为通过模拟方式创
建虚拟机。
容器镜像是轻量的、可执行的独立软件包,包含软件运行所需的所有内容:代码、运行时环境、系统工具、系统库和设置。容器化软件适用于基于 Linux 和 Windows 的应用,在任何环境中都能够始终如一地运行。容器赋予了软件独立性,使其免受外在环境差异(例如,开发和预演环境的差异)的影响,从而有助于减少团队间在相同基础设施上运行不同软件时的冲突。

2、Docker优点
(1)更快的交付和部署
使用docker 开发人员可以使用镜像来快速构建一套标准的开发环境;开发完成之后,
测试和原味人员可以直接使用完全相同的环境来部署代码,只要开发测试过的代码,
就可以确保在生产环境无缝运行。docker可以快速创建和删除容器,实现快速迭代,
大量节约开发、测试、部署的时间。
(2)更高效的资源利用
docker 容器不需要额外的虚拟化管理程序支持,他是内核级的虚拟化,可以实现更高
级的性能,同时对资源的额外需求很低。
(3)更轻松的迁移和扩展
docker容器几乎可以再任意的平台上运行,包括物理机、虚拟机、公有云、私有云、
个人电脑、服务器等,同事支持主流的操作系统发行版本。这种兼容性让用户可以再
不同平台之间轻松地迁移应用。

3、Docker使用场景
(1)使用Docker容器开发、测试、部署服务:docker本身是轻量级的,所以本地开发人员可以构建、运行并分享docker容器,容器可以在开发环境中创建,然后提交到测试,在到生产环境。
(2)创建隔离的运行环境:在很多企业应用中,同一服务的不同版本可能服务于不同的用户,使用Docker很容易创建不同的环境来运行不同版本的服务
(3)搭建测试环境:有于Docker的轻量化,所以开发者很容易在本地搭建测试环境,用来测试程序在不同系统下的兼容性,甚至集群式的测试环境。
(4)构建多用户的平台服务(PaaS)基础设施
(5)即同软件即服务(SaaS)应用程序
(6)高性能、超大规模的宿主机部署

四、对比

1、区别:
虚拟化与Docker介绍
虚拟化与Docker介绍
(1)容器是一个应用层抽象,用于将代码和依赖资源打包在一起。 多个容器可以在同一台机器上运行,共享操作系统内核,但各自作为独立的进程在用户空间中运行 。与虚拟机相比,容器占用的空间较少(容器镜像大小通常只有几十兆),瞬间就能完成启动 。
(2)虚拟机 (VM) 是一个物理硬件层抽象,用于将一台服务器变成多台服务器。 管理程序允许多个 VM 在一台机器上运行。每个VM都包含一整套操作系统、一个或多个应用、必要的二进制文件和库资源,因此 占用大量空间 。而且 VM 启动也十分缓慢 。
(3)传统虚拟化技术从操作系统层下手,目标是建立一个可以用来执行整套操作系统的沙盒独立执行环境。而容器技术则是直接将一个应用程序所需的相关程序代码、函式库、环境配置文件都打包起来建立沙盒执行环境。
(4)虚拟机需要安装操作系统(安装Guest OS)才能执行应用程序,而容器内不需要安装操作系统就能执行应用程序。容器技术不是在OS外来建立虚拟环境,而是在OS内的核心系统层来打造虚拟执行环境,透过共享Host OS的作法,取代一个一个Guest OS的功用。容器也因此被称为是OS层的虚拟化技术。

2、docker优势:
(1)docker容器很快,启动和停止可以再秒级实现,而传统的虚拟机需要数分钟
(2)docker容器对系统资源需求很少,一台主机上可以同时运行数百甚至上千个docker容

(3)docker 通过类似于git的设计理念的操作来方便用户获取、分发和更新应用镜像,存储复用,增量更新
(4)docker通过dockerfile支持灵活的自动化创建和部署机制,提高工作效率,使流程标准化
虚拟化与Docker介绍
3、docker局限性:
(1)Docker是基于Linux 64bit的,无法在32bit的linux/Windows/unix环境下使用
(2)LXC是基于cgroup等linux kernel功能的,因此container的guest系统只能是linux base的
(3)隔离性相比KVM之类的虚拟化方案还是有些欠缺,所有container公用一部分的运行库
(4)网络管理相对简单,主要是基于namespace隔离
(5)container随着用户进程的停止而销毁,container中的log等用户数据不便收集
Docker对disk的管理比较有限