Part1: “一台变多台:虚拟化如何改变服务器的游戏规则”

初步了解虚拟化技术,理解基于容器的虚拟化的特点和基本概念。

本文涉及的技术名词: Hyper-VDocker宿主机guest OS虚拟化Runtime

虚拟化技术听起来可能有些复杂,但它其实已经悄然融入了我们日常技术开发中。如果你曾经好奇过,为什么一台物理服务器能够运行多个操作系统,或者为什么开发人员可以在自己的电脑上轻松模拟出不同的环境,那么你已经接触过虚拟化的概念了。在这篇文章中,我想和大家探讨下什么是虚拟化,为什么它在开发中如此重要

本文中我们会通过一些实际的例子,比如编程运行时和邮件系统,来深入了解虚拟化如何帮助我们在开发和部署过程中更加高效和灵活。希望通过这篇文章,你能够对虚拟化技术有一个清晰的认识,并理解它在现代技术栈中的关键作用

什么是服务器虚拟化

服务器虚拟化是一项非常实用的技术,它让我们能够在一台物理服务器上创建多个虚拟实例,从而更加高效地管理计算资源。简单来说,这项技术可以让一台服务器表现得像是多台服务器在同时工作。这样不仅能更好地利用资源,还大大提升了系统的灵活性和扩展性,让网络和存储资源的配置变得更加灵活,从而能够轻松应对各种不同的应用场景。

服务器虚拟化是通过在物理服务器和软件之间加入虚拟化软件来实现的。根据虚拟化软件的安装位置和它所管理的内容,服务器虚拟化通常可以分为几种常见的模式:

  1. 托管型虚拟化:这是在现有操作系统之上运行虚拟化软件的一种方式。它的优势在于设置非常简单,特别适合用于开发测试环境或者桌面虚拟化。虽然这种方式可能会因为通过操作系统间接访问硬件资源而导致性能有所下降,但对于那些对极致性能要求不高的场景来说,它是一个相当方便的选择。
  2. 基于虚拟机监控器的虚拟化:这种虚拟化直接在物理服务器的硬件上运行虚拟化软件,通常分为两种类型:
    • Type 1(裸机型) :虚拟机监控器直接在硬件上运行,负责管理所有的虚拟机。这种方式能够高效地利用资源,通常用于企业级的数据中心。
    • Type 2(托管型) :虚拟化软件首先在操作系统上运行,然后再管理虚拟机。虽然这种方式的性能可能不如Type 1高效,但在桌面虚拟化中也表现得相当不错。
  1. 基于容器的虚拟化:这是一种更加轻量化的虚拟化方式,它不需要完整的操作系统,而是共享主机操作系统的内核。每个容器都包含应用程序和必要的依赖项,但不包括操作系统,这使得容器启动速度更快,非常适合微服务架构和云原生应用。

提到服务器虚拟化,这个概念可能有点抽象。为了让它更容易理解,不妨把它比作我们每天使用的智能手机。

想象一下,你的手机不仅可以运行各种应用程序,还能在不同的操作系统之间切换,甚至可以同时运行同一个应用的多个实例。这个过程就像服务器虚拟化一样,通过不同的技术手段,你可以在一台物理服务器上运行多个独立的虚拟环境。这种方式不仅让资源的使用变得更加灵活,还能大幅提升系统的效率和扩展性。

托管型虚拟化

就像在智能手机上安装一个模拟器,让你能运行其他平台的应用程序。这种方式简单易用,但可能会影响性能,因为它是在已有的操作系统上运行的。

托管型虚拟化是通过在主机操作系统上安装虚拟化软件来实现的,然后由该虚拟化软件管理虚拟机操作系统。

在下图中,橙色和蓝色部分代表所谓的"虚拟服务器", 表示在虚拟化软件上运行的不同虚拟机,每个虚拟机都包含一个客操操作系统和相关的应用程序。

托管型虚拟化具有以下特点:

  • 适用于在已有机器上构建虚拟服务器:当你需要在一台已经使用中的机器上构建虚拟服务器时,托管型虚拟化是一个理想的选择。你可以在不影响现有系统的情况下,添加虚拟机来运行不同的操作系统或应用程序。
  • 可以继续正常使用主机操作系统的功能:由于托管型虚拟化依赖于主机操作系统,你仍然可以像平时一样使用浏览器、文本编辑器等应用程序,而不必担心虚拟机的运行会影响这些日常操作。
  • 典型的虚拟化软件示例:实现托管型虚拟化的代表性软件包括Oracle VM VirtualBox和VMware Fusion。这些工具允许你在主机操作系统上轻松创建和管理虚拟机,使得在同一台机器上运行多个操作系统成为可能。

基于虚拟机管理程序的虚拟化

相当于在手机可以直接切换到不同的操作系统,比如从Android切换到iOS。每个系统都能直接访问硬件资源,运行得更快更流畅,这类似于裸机型虚拟化。

实现基于虚拟机监控器(Hypervisor)的虚拟化的软件通常直接安装在硬件上,并管理多个客操作系统;与托管型虚拟化类似,下图中的橙色和蓝色部分也是所谓的"虚拟服务器"

基于管理程序的虚拟化有以下两个特点t:

  • 无需等待主机操作系统启动或分配资源:由于Hypervisor直接运行在硬件之上,虚拟机可以立即启动和运行,不需要等待主机操作系统完成启动或资源分配。这种直接管理的方式使得启动速度更快,资源利用更加高效。
  • 只能运行客操作系统:在Hypervisor环境中,由于没有主机操作系统的存在,Hypervisor本身仅负责管理和运行客操作系统。这意味着你无法在Hypervisor上直接运行其他软件或应用程序,只能通过虚拟机运行各种客操作系统。

典型的虚拟机监控器如:

  • Windows Hyper-V 是由微软开发的虚拟化平台,能够在Windows操作系统上直接与硬件交互,以高效管理和运行多个虚拟机。
  • Linux KVM(Kernel-based Virtual Machine)则是一个开源的虚拟化模块,集成在Linux内核中,允许Linux系统直接作为Hypervisor运行,支持多种操作系统的虚拟机。

基于容器的虚拟化

就像手机上的应用分身功能,你可以同时运行同一个应用的多个实例,比如两个微信账号。每个分身都是独立的,但它们共享同一个操作系统和硬件资源,这就是容器虚拟化的特点。

与传统虚拟化不同,容器虚拟化不需要每个应用程序运行在独立的客操作系统中,而是共享主机操作系统的内核。这使得应用程序之间的隔离更加轻量,启动速度更快,资源利用更高效。

典型的容器虚拟化软件包括 DockerKubernetes。这些工具允许你在主机操作系统上创建和管理容器化的应用程序,每个容器都包含应用程序及其所需的依赖,但它们共享主机操作系统的内核资源。

下图中橙色和蓝色的部分为容器:

基于容器虚拟化有如下特点:

  • 由于没有客操作系统,启动成本显著降低:容器化应用程序不需要每次都启动完整的操作系统,这使得启动速度更快、资源开销更小,特别适合需要快速部署和启动的应用场景。
  • 因为不是完整的服务器,不建议在一个容器中安装多个应用程序:容器的设计初衷是轻量级、单一职责。每个容器应该只运行一个应用程序及其依赖项,避免在一个容器中运行多个应用程序,以确保隔离性和管理的简便性。
  • 由于有主机操作系统,你可以继续正常使用浏览器和编辑器等工具:容器虚拟化依赖于主机操作系统的内核,这意味着你可以在运行容器的同时继续使用主机操作系统上的其他工具和应用程序,如浏览器和文本编辑器。

容器虚拟化的优势

第一个启动快速。

另一个原因是,容器虚拟化每次只启动一个应用程序,而不是整个服务器。这个特性使得容器极为轻量,启动速度远超传统虚拟化方式。

我们可以通过下图来感受一下容器化的清凉程度, 组略地说, 这种差异就像重新启动整个电脑和仅仅执行一个脚本命令之间的区别

利用容器虚拟化的这种轻量性和快速启动的优势,我们可以将它轻松地融入一个小型的开发测试循环中。例如,你可以为运行测试准备一个容器,仅在测试期间启动它,并在几分钟后测试完成时将其丢弃。

这种方式极大地提高了测试效率和资源利用率。你不再需要维持一个长期运行的测试环境,而是可以根据需要快速创建、使用并销毁容器。这种灵活性使得容器虚拟化在现代开发流程中变得尤为重要。

第二个简单部署。

如果你在本地开发中使用托管型虚拟化,如下图所示,而目标服务器使用的是基于虚拟机监控器的虚拟化,那么部署过程会相对容易。因为在本地启动的环境与部署到服务器的环境相匹配,这确保了开发环境与生产环境的一致性,从而减少了在部署过程中可能出现的兼容性问题。

在许多情况下,部署的目标服务器可能并未进行虚拟化,而仅在本地进行虚拟化。

尽管如此,本地虚拟化仍然具有显著的优势,比如为开发人员创建统一的开发环境更加方便。这种方式在开发中非常常见。

然而,这样做可能会导致一个问题:本地启动的环境与部署到服务器的环境不一致。这种不一致可能会引发在生产环境中出现与开发环境不同的问题,从而增加调试和维护的难度。因此,确保本地开发环境与生产环境的一致性是一个需要重点解决的点。

比如:"邮件服务器一般作为一个独立的系统运行,到了生产环境上, 需要连接到该独立的邮件服务器。", 我们以express.js为例

需要注意

虽然容器不包含完整的操作系统,但它们表现得像是包含了操作系统。基于容器的虚拟化不需要启动客操作系统,但Docker让它看起来像是在运行一个Linux系统。

因此,在容器内部,你会发现像 /etc 这样的常规目录存在,lscd 等命令也可以正常使用。

从实际使用的角度来看,使用容器与使用Ubuntu或CentOS并没有太大的区别。容器虚拟化提供了一种熟悉的操作环境,同时保持了轻量化和高效性的优势。

这种表象上的一致性使得开发者在容器中工作时感觉与在传统的Linux操作系统上工作非常相似。你可以在容器中执行常见的Linux命令、编辑配置文件、安装软件包,几乎所有在Ubuntu或CentOS上能做的事情在容器中也同样可以完成。

然而,与完整的虚拟机不同,容器共享主机操作系统的内核,因此它们启动更快、占用的资源更少。这种轻量化特性使得容器非常适合于现代的微服务架构和持续集成/持续部署(CI/CD)流程。你可以在开发、测试和生产环境中使用相同的容器,从而确保一致性。

非完全隔离

尽管容器看起来像是运行着Ubuntu或CentOS,但实际上并没有操作系统在运行。容器的内核实际上是主机机器的Linux内核。

因此,需要注意的是,与虚拟服务器不同,容器并不进行硬件模拟,其与主机操作系统(尤其是其上的Linux)之间的隔离程度较低。

此外,由于Docker容器依赖于Linux内核及其功能运行,容器操作系统不可避免地被限制在Linux环境中。

例如,我们无法让Ubuntu容器和Windows Server容器共存。因为容器依赖主机的Linux内核,所以在同一台主机上无法同时运行基于不同操作系统内核的容器。

容器受主机系统影响

由于容器不包含客操作系统,而是使用主机机器上的Linux内核,因此主机操作系统的差异可能会对容器产生影响。

例如,最近我们经常听到Docker在M1 Mac上运行出现问题的案例,其背后的原因就是主机机器上的Linux内核与传统x86架构的Linux内核存在差异。因为容器依赖于主机的Linux内核,如果主机操作系统不同,那么启动的容器环境可能会有所不同。

具体来说,如果在不同的主机操作系统(如x86架构的Linux主机与基于M1芯片的Mac主机)上运行相同的容器映像,可能会导致容器的行为出现差异,甚至无法正常工作。这是因为容器中的所有系统调用和底层操作都是通过主机的Linux内核完成的,因此不同的内核版本或架构可能导致不兼容或功能差异。

如下图我们可以清晰得出结论: 尽管容器是一种虚拟化技术,但它们并不是完全独立于主机操作系统的。容器依赖主机的操作系统内核来运行,这意味着主机操作系统的差异可能会直接影响容器的行为和性能。虽然容器提供了一种隔离的环境,但它们与主机操作系统之间仍然存在紧密的联系,这与传统的虚拟机有所不同。

总结

  • 托管型虚拟化:安装在主机操作系统上,管理客操作系统。
  • 基于虚拟机监控器的虚拟化:直接安装在硬件上,管理客操作系统。
  • 基于容器的虚拟化:管理安装在主机操作系统上的应用程序。

基于容器的虚拟化的优点

  • 启动速度快
  • 部署方便

关于基于容器的虚拟化的注意事项

  • 隔离性不如其他方法彻底
  • 主机操作系统会影响容器的行为
相关推荐
Java陈序员2 小时前
再见 Navicat!一款开源的 Web 数据库管理工具!
java·react.js·docker
MickeyCV14 小时前
使用Docker部署MySQL&Redis容器与常见命令
redis·mysql·docker·容器·wsl·镜像
棠十一14 小时前
Rabbitmq
分布式·docker·rabbitmq
藥瓿亭15 小时前
K8S认证|CKS题库+答案| 6. 创建 Secret
运维·ubuntu·docker·云原生·容器·kubernetes·cks
2302_8097983216 小时前
【JavaWeb】Docker项目部署
java·运维·后端·青少年编程·docker·容器
嵌入式大圣16 小时前
Neko虚拟浏览器远程协作方案:Docker+内网穿透技术部署实践
运维·docker·容器
极简网络科技18 小时前
Docker、Wsl 打包迁移环境
运维·docker·容器
杨浦老苏18 小时前
轻量级Docker管理工具Docker Switchboard
运维·docker·群晖
江湖有缘18 小时前
【Docker管理工具】部署Docker可视化管理面板Dpanel
运维·docker·容器
一加一等于二18 小时前
docker部署postgresql17,并且安装插件
docker·postgresql