虚拟化技术概述

所谓虚拟化,就是在一台计算机上同时运行多个操作系统,即在同一个物理平台上创造出多台不同机器的假象。每个运行在主机上的操作系统称为“虚拟机”。不同的虚拟机之间是互相隔离的,也就是说一个虚拟机的故障不会影响其他虚拟机。
虚拟化技术最初的应用主要是在服务器应用部署、开发测试等场景中。一台服务器的价格是相当昂贵的,为了充分利用它,一台服务器上往往需要部署多个应用程序。为了避免应用程序的环境的互相影响,我们往往是每部署一个应用就开一个专用的虚拟机。这样维护起来就相对容易,不用担心搞坏其他应用。
虚拟机由几个文件构成,这些文件定义了虚拟服务器(vCPU)、内存大小、IO设备、可访问的存储空间、网卡等信息。由于虚拟机由文件构成,因此它的备份、克隆十分方便。虚拟机的完美副本仅需几分钟即可完成,极大地方便了环境的统一化。
如今,虚拟化技术一个重要应用就是云计算。我们从云上获取的一台计算机(IaaS),或者某项服务(PaaS),并不对应着专门的物理资源,而是与其他用户共享物理资源的虚拟机。

Hypervisor 技术

虚拟化的核心技术是 虚拟机监控程序(Virtual Machine Monitor,VMM),现在一般称为虚拟机管理程序(Hypervisor)。它是个介于硬件和虚拟机之间的软件,作为资源代理的形式存在。
Hypervisor 有两类实现。

  • 1类虚拟机管理程序。
    它直接运行在物理硬件之上,更像一个特殊的操作系统。案例有:VMware ESXi、微软 Hyper-V 和 Xen 系列等。其架构如下图所示:
    在这里插入图片描述
  • 2类虚拟机管理程序。
    第2类更好理解,它像一个传统的应用程序一样,运行在主机的原有操作系统之上。著名的案例有:VMware Workstation、Oracle 的 Virtual Box 等产品。
    在这里插入图片描述

微软 Hyper-V

Hyper-V 是微软提出的一种虚拟机管理程序,最早与 Windows Server 2008 同时发布。它属于第1类 Hypervisor,因此从架构上讲 Hyper-V 只有 “硬件-Hyper-V-虚拟机” 三层,本身非常小巧,代码简单,且不包含任何第三方驱动,所以安全可靠、执行效率高,能充分利用硬件资源,使虚拟机系统性能更接近真实系统性能。
Hyper-V 在Windows Server 2012及以后的系统中是内置的。它的架构如下图所示。父分区不仅作为虚拟机监控程序,同时还运行着Windows Server系统。
在这里插入图片描述

它可以完美支持 Linux 系统。Hyper-V 可以采用半虚拟化(Para-virtualization)和全虚拟化(Full-virtualization)两种模拟方式创建虚拟机。半虚拟化方式要求虚拟机与物理主机的操作系统(通常是版本相同的Windows)相同,以使虚拟机达到高的性能;全虚拟化方式要求CPU支持全虚拟化功能(如Inter-VT或AMD-V),以便能够创建使用不同的操作系统(如Linux和Mac OS)的虚拟机。

容器技术概述

上文介绍了虚拟化技术,它主要是用来提供一个完整的虚拟硬件平台用以支持操作系统的运行。因此,虚拟化为 IaaS 技术实现提供了可能。而与之对应的,容器技术的诞生其实主要提供了 PaaS 层的技术实现。

痛点——虚拟机难以满足需求

容器(Container)英文名称的本意为 “集装箱”。是的,容器技术的诞生其实就是借鉴了集装箱的特点。

早期航运是没有集装箱概念的,那时候货物杂乱无章的放置,在全球化贸易的不断推进中,这种原始运输方式极大地影响了出货和运输效率。集装箱便应运而生,其特点在于格式划一,并可以层层重叠,所以可以大量放置在特别设计的远洋轮船中。有了集装箱,运输更加便捷、高效、简单。

与货物运输类似,应用程序也需要进行 “运输”(部署、发布、迁移、拷贝等)。软件的运行依赖于其环境,为了排除外部系统干扰,方便移植,应用程序也需要一个 “集装箱” 来进行打包、快速移植。

而虚拟机就是一种符合要求的容器,我们能够通过虚拟机镜像来打包我们的应用。在早期 IT 界,大家都认为基于 Hypervisor 的虚拟机可以最大程度上提供虚拟化管理的灵活性。各种不同操作系统的虚拟机都能通过 Hypervisor 来衍生、运行、销毁。然而,随着时间推移, Hypervisor 这种方式麻烦越来越多。虚拟机的不足之处主要体现在资源占用大、操作复杂等方面。对于 Hypervisor 环境来说,每个虚拟机都需要运行一个完整的操作系统(可以达到数个GB)以及其中安装好的大量应用程序。但实际生产开发环境里,我们更关注的是自己部署的应用程序(一般都不会太大),如果每次部署发布我都得搞一个完整操作系统和附带的依赖环境,那么这让任务和性能变得很重和很低下。

在这里插入图片描述

虚拟机占用大量系统资源

于是,我们开始寻求对操作系统(而不是硬件)复用的技术。这样就不用再安装一套操作系统和依赖环境。

2008年诞生的 Linux Container 容器技术的诞生解决了这个问题。Linux Container(简称LXC)是一种 内核轻量级的操作系统层虚拟化 技术。Linux Container 主要由 Namespace 和 Cgroup 两大机制来保证实现。那么 Namespace 和 Cgroup 是什么呢?刚才我们上面提到了集装箱,集装箱的作用当然是可以对货物进行打包隔离了,不让A公司的货跟B公司的货混在一起,不然卸货就分不清楚了。那么Namespace也是一样的作用,做隔离。光有隔离还没用,我们还需要对货物进行资源的管理。同样的,航运码头也有这样的管理机制:货物用什么样规格大小的集装箱,货物用多少个集装箱,货物哪些优先运走,遇到极端天气怎么暂停运输服务怎么改航道等等… 通用的,与此对应的Cgroup就负责资源管理控制作用,比如进程组使用CPU/MEM的限制,进程组的优先级控制,进程组的挂起和恢复等等。

在这里插入图片描述

Linux Container 架构

容器(作为进程)共用内核并提供额外的隔离手段,避免虚拟的操作系统占用。

在这里插入图片描述

容器技术架构

VM与Docker对比

Docker容器 vs 虚拟机

容器技术的特点

传统的虚拟化(虚拟机)技术,创建环境和部署应用都很麻烦,而且应用的移植性也很繁琐,比如你要把vmware里的虚拟机迁移到KVM里就很繁琐(需要做镜像格式的转换)。那么有了容器技术就简单了,总结下容器技术主要有三个特点:

  • 极其轻量:只打包了必要的Bin/Lib;
  • 秒级部署:根据镜像的不同,容器的部署大概在毫秒与秒之间(比虚拟机强很多);
  • 易于移植:一次构建,随处部署;
  • 弹性伸缩:Kubernetes、Swam、Mesos这类开源、方便、好使的容器管理平台有着非常强大的弹性管理能力。

容器技术典型应用场景

  • 容器化传统应用。
    容器不仅能提高现有应用的安全性和可移植性,还能节约成本。每个企业的环境中都有一套较旧的应用来服务于客户或自动执行业务流程。即使是大规模的单体应用,通过容器隔离的增强安全性、以及可移植性特点,也能从 Docker 中获益,从而降低成本。一旦容器化之后,这些应用可以扩展额外的服务或者转变到微服务架构之上。

  • 持续集成和持续部署 (CI/CD)
    通过 Docker 加速应用管道自动化和应用部署,交付速度提高至少 13 倍。现代化开发流程快速、持续且具备自动执行能力,最终目标是开发出更加可靠的软件。通过持续集成 (CI) 和持续部署 (CD),每次开发人员签入代码并顺利测试之后,IT 团队都能够集成新代码。作为开发运维方法的基础,CI/CD 创造了一种实时反馈回路机制,持续地传输小型迭代更改,从而加速更改,提高质量。CI 环境通常是完全自动化的,通过 git 推送命令触发测试,测试成功时自动构建新镜像,然后推送到 Docker 镜像库。通过后续的自动化和脚本,可以将新镜像的容器部署到预演环境,从而进行进一步测试。

  • 微服务——加速应用架构现代化进程
    应用架构正在从采用瀑布模型开发法的单体代码库转变为独立开发和部署的松耦合服务。成千上万个这样的服务相互连接就形成了应用。Docker 允许开发人员选择最适合于每种服务的工具或技术栈,隔离服务以消除任何潜在的冲突,从而避免“地狱式的矩阵依赖”。这些容器可以独立于应用的其他服务组件,轻松地共享、部署、更新和瞬间扩展。Docker 的端到端安全功能让团队能够构建和运行最低权限的微服务模型,服务所需的资源(其他应用、涉密信息、计算资源等)会适时被创建并被访问。

  • IT 基础设施优化——充分利用基础设施,节省资金。
    Docker 和容器有助于优化 IT 基础设施的利用率和成本。优化不仅仅是指削减成本,还能确保在适当的时间有效地使用适当的资源。容器是一种轻量级的打包和隔离应用工作负载的方法,所以 Docker 允许在同一物理或虚拟服务器上毫不冲突地运行多项工作负载。企业可以整合数据中心,将并购而来的IT资源进行整合,从而获得向云端的可迁移性,同时减少操作系统和服务器的维护工作。

Windows 中的容器

正当 Linux 世界的容器技术借着 Docker 的东风刮遍世界的时候,Windows 系统也发现了容器粒度的重要性。

微软与 Docker 在 2014 年宣布了合作,以期将容器技术带到 Windows Server 操作系统,并为传统的 Windows 应用程序的容器化改造提供更直接的支持。不久之后,微软在 Ignite 2015 上宣布将推出为容器优化的 Windows Nano Server;第一次 Windows 容器真正与与开发者见面是在 Windows 10 的年度更新(2016.8)上,它正式提供 Windows 容器的开发环境。在 2017 年 10 月发布的 Windows Server 1709 版本包含了 Windows 容器,意味着这项技术可以用于生产环境了。Windows 容器是真正能够运行 Windows 应用程序的容器技术,包括依赖 IIS、注册表等大量 Windows 特性的应用程序都可以在 Windows 容器中运行。

虽然 Windows 对容器的支持有些姗姗来迟,但社区对 Windows 容器的关注和运用却是异常活跃。这主要得益于容器技术本身生态的成熟,一来人们对这项技术已经有了充分的认知,同时周边工具和实践都已经日趋完善。另一方面,在与 Docker 公司一同打造这项技术的过程中,也注意了与已有技术的兼容性。人们发现,在电脑上启用 Windows Container 功能之后,接下来的操作步骤仍然是基于 Docker 客户端完成的,命令行参数与 Linux 上的 Docker 也没有区别。

Windows支持两种不同类型的容器,即 Windows Server 容器和 Hyper-V 容器。 这两种类型的容器的使用方式相同,也支持相同的容器映像。 但是它们的实现机制不同,提供了不同的安全隔离级别。

  • Windows Server 容器:非常类似于Linux中的容器,使用通过命名空间、资源控制实现进程隔离。每个Windows Server容器都与宿主机共享同一个内核。因此,只能运行Windows应用。
  • Hyper-V 容器:每个容器都运行在一个高度优化的Hyper-V虚拟机中,所以容器拥有独立的内核。这样容器的隔离性会更好,但是启动速度会慢一些,其资源占用也会增加。

在这里插入图片描述

Windows容器 与 Hyper-V容器

Hyper-V Container

Windows 10 目前只支持 Hyper-V类型的Windows容器。在Windows10之前,Docker 通过 Virtualbox 虚拟机来提供 Windows 平台的容器,即 Docker Toolbox/Machine。如今,Docker for Windows 依赖于微软的虚拟化技术Hyper-V。64位的Windows 10在专业版、企业版和教育版中,提供了Hyper-V支持。
由于Hyper-V 容器拥有独立的操作系统,且支持众多Linux系统,因此,Hyper-V容器支持运行Linux 应用程序。

Windows Server Container

Docker 可以以两种形式运行在 Windows 上:以 Hyper-V 虚拟机的形式运行 Linux 格式的容器,或者运行原生的 Windows 容器。其中前者运行 Linux 格式的应用程序,后者能运行 Windows 应用程序。如果稍微用一点技巧,还可以让这两者同时运行在 Windows 电脑上。

Windows 10 和 Windows Server 都提供了对 Windows 容器的支持,各种容器化工具对 Windows 容器的支持也在日趋完善当中。基于 Windows 开发新的应用时一方面可以优先考虑跨平台容器化部署的能力,另一方面也可以与存量应用程序一样考虑借助 Windows 容器技术实现容器化、云原生的特性。

参考资料

[1] 十分钟明白什么是容器技术
[2] Docker的Windows容器初体验
[3] 容器化技术与Docker
[4] CGroup 介绍、应用实例及原理描述
[5] Docker overview
[6] Docker concepts
[7] Install Docker Desktop on Windows
[8] Install Docker Toolbox on Windows
[9] Microsoft Virtualization Documentation
[10] Containers on Windows Documentation
[11] Docker携手Windows Server:一场精彩的双赢
[12] 在 Windows 上可以用 Docker 吗?
[13] 细说 Windows 与 Docker 之间的趣事
[14] 微软发布 Windows Server 2016 的最新预览版,Docker 首次亮相
[15] Windows Docker 安装

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐