容器和虚拟机有什么区别?

我想理解所有这些与虚拟机不同的容器。 对于这两种虚拟化方法都可以观察到具有所有操作系统的文件系统。 但是在一个Docker容器中,例如centos 5.x,如果我在容器的shell中执行uname -a ,输出将显示我的主机内核版本。 它是如何工作的,以及与经典虚拟机(vmware,virtualbox,xen等)的主要区别?

两种forms都允许多个操作系统在单个物理机器上运行。

有了容器,这些操作系统是孤立的(它们有自己的文件系统,进程,库,包括libc ,IP地址等),但它们仍然共享相同的内核。 这就是uname -a显示主机内核版本的原因。

使用传统的虚拟化,操作系统有自己的内核运行。 这些多核不是在真实的硬件之上运行,而是在一个称为pipe理程序的软件提供的虚拟化硬件之上。 与基于容器的虚拟化相比,这是一个额外的层。

各种虚拟化都有它的长处和短处。 容器在操作系统的select上更加有限,容器必须被运行的内核支持(例如: Solaris上的Solaris区域 , Linux 上的 LXC , AIX 上的 WPAR ),尽pipe从技术上讲,没有任何内核开发人员不支持“外部“用户区(例如:lxbrand = Solaris 10和SmartOS 上的Linux区域 ,或者更新的Windows 10上的Ubuntu运行时 ),而在使用虚拟机pipe理程序时,操作系统只需要虚拟硬件支持,这允许多种configuration(例如: Linux 32位和64位内核,* BSD,Solaris,Windows,Mac OS X …)

容器的主要优势在于它们轻得多,应用程序性能基本上与真正的裸机操作系统安装相同。 新的容器实例化速度要快得多,因为没有额外的内核可以启动,并且虚拟环境密度可以更高,因为没有额外的内核可以运行。

请注意, Docker 不是一个容器实现。 Docker是在容器中运行的应用程序的构build/包装/分发标准,包括运行它们的引擎以及最近添加的编排器 。 这个引擎的作用类似于一个pipe理程序,但对于容器上的应用程序。

一个好的起点是阅读维基百科的文章 :

操作系统级虚拟化是一种服务器虚拟化方法,操作系统的内核允许存在多个独立的用户空间实例 ,而不是一个。 从业主和用户的angular度来看,这种有时被称为容器,软件容器, 虚拟化引擎 (VE)或监狱( FreeBSD jail或chroot jail )的实例可能看起来和感觉就像是真正的服务器。

在类Unix操作系统上,这种技术可以被看作标准chroot机制的高级实现。 内核通常提供资源pipe理function,以限制一个容器活动对其他容器的影响。 […]

我想理解所有这些与虚拟机不同的容器。

使用虚拟化技术,可以传递的软件包是一个虚拟机,它包含一个完整的操作系统以及应用程序。 运行三个虚拟机的物理服务器将拥有一个pipe理程序和三个独立的操作系统。

相比之下,像Docker一样运行三个集装箱化应用程序的服务器运行单个操作系统,每个容器与其他容器共享操作系统内核。 操作系统的共享部分是只读的,而每个容器都有自己的挂载(即访问容器的方式)来写入。 这意味着容器比虚拟机轻得多,使用的资源要less得多。

你还想知道什么? 你错过了哪些细节?