![容器和虚拟机有什么区别?](https://linux22.com/image/686130/%E5%AE%B9%E5%99%A8%E5%92%8C%E8%99%9A%E6%8B%9F%E6%9C%BA%E6%9C%89%E4%BB%80%E4%B9%88%E5%8C%BA%E5%88%AB%EF%BC%9F.png)
我想理解容器与虚拟机的所有不同之处。这两种虚拟化方法都可以观察到具有所有操作系统的文件系统。但是在 Docker 容器中,例如 centos 5.x,如果我uname -a
在容器的 shell 中执行,输出将显示我的主机内核版本。它如何工作以及与传统虚拟机(vmware、virtualbox、xen 等)的主要区别是什么?
答案1
两种形式都允许在一台物理机上运行多个操作系统。
使用容器,这些操作系统是隔离的(它们有自己的文件系统、进程、库,包括、IP 地址等),但它们仍然共享同一个内核。这就是为什么显示主机内核版本的libc
原因。uname -a
在传统虚拟化中,每个操作系统都有自己的内核运行。这些内核不是在实际硬件上运行,而是在由称为虚拟机管理程序的软件提供的虚拟化硬件上运行。与基于容器的虚拟化相比,这是一个额外的层。
每种虚拟化都有其优点和缺点。容器在操作系统的选择上受到更多限制,容器必须由运行的内核支持(例如:Solaris 上的 Solaris 区域,Linux 上的 LXC,AIX 上的 WPAR)尽管从技术上讲,没有什么可以禁止内核开发人员实现对“外星”用户空间的支持(例如:lxbrand =Solaris 10 上的 Linux 区域和智能操作系统或最近Windows 10 上的 Ubuntu 运行时),而使用虚拟机管理程序时,操作系统只需要虚拟硬件支持,这允许多种异构配置(例如:Linux 32 位和 64 位内核、*BSD、Solaris、Windows、Mac OS X,...)
容器的主要优势在于它们更轻量,应用程序性能与真正的裸机操作系统安装基本相同。新容器实例化速度更快,因为无需启动额外的内核,虚拟环境密度也可以更高,因为无需运行额外的内核。
注意Docker是不是容器实现。Docker 是用于在容器并包括一个引擎来运行它们,并且最近添加了一个协调器这个引擎的作用类似于虚拟机管理程序,但针对的是容器上的应用程序。
答案2
一个很好的起点是阅读维基百科文章:
操作系统级虚拟化是一种服务器虚拟化方法,其中操作系统的内核允许存在多个独立的用户空间实例,而不是只有一个。这些实例有时被称为容器、软件容器,虚拟化引擎(VE)或监狱(FreeBSD 监狱或者chroot 监狱),从其所有者和用户的角度来看,可能看起来和感觉起来就像一个真实的服务器。
在类Unix操作系统上,该技术可以看作是标准的高级实现chroot机制。除了隔离机制之外,内核通常还提供资源管理功能来限制一个容器的活动对其他容器的影响。 [...]
我想理解容器和虚拟机之间的所有区别。
借助虚拟化技术,可以传递的软件包是虚拟机,它包括整个操作系统以及应用程序。运行三台虚拟机的物理服务器将有一个虚拟机管理程序和三个在其上运行的独立操作系统。
相比之下,运行三个容器化应用程序(如 Docker)的服务器运行单个操作系统,每个容器与其他容器共享操作系统内核。操作系统的共享部分是只读的,而每个容器都有自己的挂载(即访问容器的方式)用于写入。这意味着容器比虚拟机更轻量,使用的资源也少得多。
你还想知道什么?你到底错过了哪些细节?