Linux虚拟化和容器:Virtualbox,KVM,Xen,LXC和Docker

原文
https://www.davidokwii.com/linux-virtualization-and-containers-virtualbox-kvm-xen-lxc-and-docker/

由于需要在不增加计算成本的情况下设置隔离的应用程序和服务器环境,虚拟化变得非常流行。

虚拟机和管理程序

您可以在另一台通常称为主机的计算机内安装一台完整的计算机(称为虚拟机),而不是在每个其他硬件单元上购买和安装服务器。

因此,这种支持这种魔术的软件被称为“管理程序”。 管理程序或虚拟机监视器(VMM)是计算机软件,固件或硬件,用于创建和运行虚拟机〜 * 。

因此,该软件可以在主机的操作系统上运行,也可以像操作系统一样安装在计算机硬盘上。 像操作系统一样安装的那些称为裸机虚拟机管理程序,一个很好的例子是Microsoft Hyper-V或VMware ESX / ESXi。

但是,您可能更熟悉运行主机操作系统的虚拟机管理程序,即托管的虚拟机管理程序。 这些非常容易设置和使用,它们包括; VMware Workstation,VMware Player,VirtualBox,KVM,适用于Mac和QEMU的Parallels Desktop。

我个人使用Vmware Player和大多数虚拟机来在我的个人笔记本电脑上启动一些虚拟机(VM)。

VirtualBox

如果你玩了一段时间的电脑, VirtualBox不需要介绍。 它的开源并归Oracle所有 。

Virtualbox是一个多平台,因为它在Windows,Linux,Macintosh和Solaris主机上运行,​​并支持来自Windows,Linux系列和Solaris,FreeBSD和DOS等其他客户操作系统。 这才是令人敬畏的原因。 但是,它不包含在主线Linux内核中,因此您必须编译并插入相应的内核模块。

它也非常易于使用,因为它带有一个很酷的直观界面,可用于创建,克隆,快照和销毁虚拟机。 如果您设置开发环境并希望非常容易地隔离Web,数据库和应用程序服务器,则可以使用virtualbox为单个主机上的每个服务器创建Vms。

希望启动Linux开发环境的Windows开发人员总是在Windows操作系统上使用Virtualbox来运行Linux发行版,例如Ubuntu用于LAMP堆栈。

进一步阅读;

https://www.virtualbox.org/

KVM

KVM最近在云计算领域掀起了波澜。 KVM本身不执行任何仿真,但它暴露了 /dev/kvm 接口,外部用户空间主机可以通过该接口进行仿真。 QEMU就是这样一个主机,所以你经常会看到KVM被称为KVM/QEMU。

来自Red Hat并且已经进入主流Linux,它被许多云提供商使用,如Linode和Digital ocean等。 它主要供企业用户使用,特别是虚拟专用服务器/VPS或云VM提供商,用于向客户提供和销售VPS。

VirtualBox和VMware将安装在大多数具有x86处理器的计算机上,但KVM要求处理器支持Intel-VT或AMD-VT扩展,并且这些扩展在BIOS中启用。 KVM附带VirtManager,这是一个管理VM的工具。 Openstack也使用KVM,它以建立和管理公共云和私有云的云计算平台而闻名。

我在我的机器上安装了一次KVM,但从来没有真正迷上过。 KVM的学习曲线稍微陡峭,文档和支持较少,只能在Linux上运行。

但是,KVM具有高度可扩展性。 它采用先进的安全功能,利用SELinux。 它在虚拟机之间提供MAC(强制访问控制)安全性。 KVM因获得共同的*和军​​事安全标准以及允许开放虚拟化国土安全项目而获奖。

进一步阅读;

http://www.linux-kvm.org/
https://en.wikipedia.org/wiki/Kernel-based_Virtual_Machine

XEN

另一个传统上与Linux相关的虚拟机管理程序是Xen。 Xen比其他虚拟机管理程序更旧。 它来自XenServer项目,OracleVM或任何数量的操作系统,如CentOS,Suse,Ubuntu和NetBSD,它们都内置了Xen。它目前被云巨头亚马逊AWS用于管理其数百万台Linux服务器。

如果您想深入挖掘,可以在此处找到完整的Hypervisor比较

现在关于上面讨论的Hypervisors的事情是创建的虚拟机需要运行单独的内核实例。 因此,主机操作系统内核可以在与客户机或虚拟机内核完全不同的版本上运行。 这很好,因为您具有完整的应用程序环境隔离和可能更高的安全性。

但是,由于需要具有自己内核的完整操作系统,因此还存在性能瓶颈。

这是Linux容器的用武之地。

LXC/LXD

LXC或Linux容器是基于操作系统的基本操作系统内核的轻量级和可移植操作系统,但同时充当具有自己的文件系统,进程和TCP / IP堆栈的隔离环境。

因此容器不会再次创建整个操作系统或内核。 并且多个容器共享相同的内核,并且每个容器可以被约束为仅使用定义数量的资源,例如CPU,内存和 I/O.

它们可以与FreeBSD上的Solaris Zones或Jails进行比较。 由于没有虚拟化开销,因此它们的性能远远优于虚拟机。 ~ Nedo @ * 。

Linux.com将容器列为2016年最佳5代下一代云技术之一。

我主要在AWS或Linode上的远程VPS上使用Linux容器,我对它们的强大程度感到惊讶。 虽然Linux容器不能为您提供Hypervisor创建的VM的全部功能,但它们具有内存和处理器占用空间小的优势。 我已经能够在AWS上的1GB v*n上启动3个LXC,它们都运行得很好。 您无法使用virtualbox或KVM执行此操作。

Ubuntu上的LXC软件包非常棒,因为它可以自动设置主机操作系统和容器之间的网络连接 - 这通常会让新手闯入。

LXD同时也是新的LXC体验,具有直观的用户体验和单一的命令行工具来管理您的容器。 可以通过REST API以透明的方式通过网络管理容器。 它还可以通过与OpenStack集成来进行大规模部署。

管理程序和容器之间的区别

管理程序:基于模拟硬件
容器:关于虚拟化操作子系统(文件系统,网络等)。

容器:单核
管理程序:多个内核

容器:易于扩展,资源效率更高。
管理程序:需要更多资源且可扩展性更低。

vm vs容器

虚拟机包含完整的操作系统和应用程序。 基于虚拟机管理程序的虚拟化是资源密集型的,虚拟机可以占用几GB,取决于操作系统的来宾。

虚拟机使用虚拟机管理程序来共享和管理硬件,而容器共享主机操作系统的内核以访问硬件。

虚拟机有自己的内核,它们不使用和共享主机操作系统的内核,因此它们在深层次上相互隔离。

驻留在同一服务器上的虚拟机可以运行不同的操作系统。 一台虚拟机可以运行Windows,而隔壁的虚拟机可能正在运行Ubuntu。

容器受主机操作系统的约束,同一服务器上的容器使用相同的操作系统。

Linux虚拟化和容器:Virtualbox,KVM,Xen,LXC和Docker

当虚拟机虚拟化底层硬件时,容器正在虚拟化底层操作系统。

进一步阅读;

https://lwn.net/Articles/531114/
https://lwn.net/Articles/671722/
https://www.docker.com/
https://runc.io/
https://containerd.tools/
https://github.com/coreos/rkt
https://medium.com/flow-ci/introduction-to-containers-concept-pros-and-cons-orchestration-docker-and-other-alternatives-9a2f1b61132c

docker

这可能是虚拟化领域最热门的新手。 Docker主要由开发人员和开发人员使用,它使用LXC容器来更轻松地创建,部署和运行应用程序。 虽然它是最受欢迎的容器技术,但有几种Docker替代品,它们包括; LXC / LXD,Solaris Zones,CoreOS的RKT和BSD Jails。

由dotCloud开发,这是一个平台即服务公司,现在更名为Docker Inc ,Docker已成为开发人员的首选工具,他们希望将应用程序打包成所需的所有部分,例如库和其他依赖关系,并将其作为一个包发布。

通常,开发人员有一个开发环境,用于编写和测试代码 - 通常是在本地计算机或开发服务器上。 然后是一个运行实时应用程序的独立生产服务器。

当应用程序经过测试并准备部署时,代码将被推送到生产服务器。 由于开发和生产环境不同,通常会出现问题。 在生产服务器在另一个操作系统上运行时,在一个操作系统上进行开发和测试甚至是常见的。 这引起了开发人员的许多挫败感。

或者您熟悉您的应用程序在您的计算机上运行但在您朋友的PC上无法运行的情况?

Docker通过允许开发人员将他们的应用程序打包为容器并简单地将容器部署到具有所需配置的生产服务器来解决此问题。

就个人而言,我已经对它进行了测试,但从来没有像LXC那样迷上它。 可能那是因为我是一个系统人员,所以我需要更多的灵活性,我的容器/ VM在我看来LXC比Docker更好。 但这只是一个偏好问题。

我真的没有使用Docker进行开发工作流程的另一个原因是我们在乌干达的互联网链接很慢。 一个基本的docker Image大概可以是300-500MB,并且通过互联网拉动它可以在~1Mbps链路上进行非常缓慢的过程。 如此昂贵的数据计划和缓慢的互联网连接使大多数非洲开发人员远离Docker等工具。

容易出现容器的多云:容器编排
由于可以在单个服务器上安装多个容器,因此最终可能难以管理。

这需要容器引擎或容器编排工具,这些工具可以消除管理这些容器的麻烦。 这些工具具有许多独特的服务,用于管理容器的工作负载和跨系统的直接通信。

例子包括;

Amazon ECS - Amazon EC2容器服务(ECS)支持Docker容器。
Azure容器服务(ACS) - ACS是Azure Compute资源提供程序,用于创建和管理充当容器主机的虚拟机群集。
CoreOS Fleet( 已弃用 ) - CoreOS fleet将单个计算机聚合到一个资源池中。 服务不是在特定计算机上运行服务,而是提交给车队集群管理器,后者决定应该在哪里运行。
Cloud Foundry的Diego - Diego是一个自我修复的容器管理系统,它试图在Diego Cells中保持正确数量的实例运行,以避免网络故障和崩溃。
Docker Swarm(现已集成到Docker中) - Docker带有集群,可以大规模运行应用程序,以及复杂的调度和监控,以构建高可用性和容错服务。
Kubernetes - Kubernetes,由Google构建,是一个开源系统,用于自动化容器化应用程序的部署,扩展和管理。 它是迄今为止最受欢迎的容器管理工具。
Mesosphere Marathon - Marathon是Mesosphere数据中心操作系统(DC / OS)和Apache Mesos的生产级容器编排平台。

小结

我的预测是,由于容量轻,资源效率高,容器可能很快就会在云空间中取代传统的虚拟机。

希望这篇文章能有助于清除虚拟化技术和流行语的所有疑问。