容器和虚拟机到底有啥区别?

Docker这几年的迅猛发展让容器从新流行起来,不过但很资料里介绍Docker时都说是 "新瓶装旧酒"。除了容器外虚拟机也是咱们或多或少会接触到的虚拟化技术。虚拟机和容器都用于建立隔离的虚拟环境,可是这两种虚拟化技术有显著的不一样,今天的文章就来聊一下它们之间的区别。web

虚拟机

虚拟机(VM)是共享一个服务器的物理资源的操做系统。它是主机硬件上的Guest,所以也被称为Guest虚拟机。安全

虚拟机由几层组成。支持虚拟化的层是hypervisorhypervisor是一种虚拟化服务器的软件。服务器

虚拟机是怎么工做的

运行应用程序所需的一切都包含在虚拟机里--虚拟化的硬件,操做系统以及任何所需的二进制文件和库。所以,虚拟机具备本身独立的基础架构。网络

虚拟机架构图
虚拟机架构图

虚拟机的优点

虚拟机可减小在服务器设备上的支出,能够利用一个物理服务器资源切分红多个独立的虚拟机来完成许多工做。架构

因为只有一台主机,所以能够利用虚拟机管理程序的集中功能高效地管理全部虚拟环境。这些系统彻底相互独立,这意味着你能够在不一样的虚拟机里安装不一样的系统环境。编辑器

最重要的是,虚拟机与主机操做系统隔离,是进行实验和开发应用程序的安全场所。微服务

虚拟机的劣势

虚拟机可能占用主机的大量系统资源,虚拟机的大小为数GB。在虚拟服务器上运行单个应用程序意味着还要运行Guest OS以及Guest OS运行所需的全部硬件的虚拟副本。这样很快就增长了不少RAMCPU资源消耗。flex

迁移虚拟机上运行的应用程序的过程也可能很复杂,由于它始终附加在操做系统上。所以,必须同时迁移应用程序和操做系统。一样,在建立虚拟机时,系统管理程序会分配专用于VM的硬件资源。 不过与运行单独的实体服务器相比,这仍然是经济的。url

容器

容器是一个不依赖于操做系统,运行应用程序的环境。它经过Linux的NamespacesCgroups技术对应用程序进程进行隔离和限制的,Namespace的做用是隔离,它让应用进程只能看到该Namespace内的世界;而Cgroups 的做用是限制分配给进程的宿主机资源。但对于宿主机来讲,这些被“隔离”了的进程跟其余进程并无太大区别。spa

容器只是运行在宿主机上的一种特殊的进程,多个容器之间使用的仍是同一个宿主机的操做系统内核。

关于NamespacesCgroups后面再详细介绍,这里你只知道他们是启动隔离和限制应用进程的就好了。

容器是怎么工做的

Namespace的做用是隔离,它让应用进程只能看到该Namespace内的世界;而Cgroups的做用是限制,它给这个世界围上了一圈看不见的墙。经过Mount Namespace能够修改容器进程对本身的文件系统 "挂载点"的认知。在容器进程启动以前从新挂载它的整个根目录"/"(经过pivot_root系统调用改变进程的文件系统,若是系统不支持,则使用chroot),而因为Mount Namespace的存在,这个挂载对宿主机不可见的。这个挂载在容器根目录上、用来为容器进程提供隔离后执行环境的文件系统,就是所谓的“容器镜像”。它还有一个更为专业的名字,叫做:rootfs(根文件系统)。rootfs只是一个操做系统所包含的文件、配置和目录,并不包括操做系统内核。

因此说,rootfs 只包括了操做系统的 "躯壳",并无包括操做系统的内核。同一台机器上的全部容器,都共享宿主机操做系统的内核。

这就意味着,若是容器里的应用程序须要配置内核参数、跟内核进行直接的交互,这些都是操做的宿主机操做系统的内核,它对于该机器上的全部容器来讲是一个“全局变量”,牵一发而动全身。这也是容器相比于虚拟机的主要缺陷之一:毕竟虚拟机有模拟出来的硬件机器充当沙盒,并且每一个虚拟机里还运行着一个完整Guest OS让应用随便折腾。不过因为rootfs里打包的不仅是应用,而是整个操做系统的文件和目录,也就意味着,应用以及它运行所须要的全部依赖,都被封装在了一块儿。这就赋予了容器所谓的一致性:不管在本地、云端,仍是在一台任何地方的机器上,用户只须要解压打包好的容器镜像,那么这个应用运行所须要的完整的执行环境就被重现出来。

容器的优点

容器占用的大小比虚拟机小不少,甚至能够小到10MB,能够轻松限制容器的内存和CPU使用率。与部署应用须要部署整个操做系统的虚拟机相比,容器很是轻巧且启动迅速。这样让咱们能够快速扩展容器并添加相同的容器。

一样,容器对于持续集成和持续部署(CI / CD)实施也是极好的选择。他们经过在开发人员之间分发和合并镜像来促进协做开发。

容器的劣势

容器仍没法提供与虚拟机相同的安全性和稳定性。因为它们共享主机的内核,所以不能像虚拟机同样彻底隔离。

容器是进程级的隔离,一个容器能够经过影响宿主机内核的稳定性来影响其余容器。

一旦容器执行了任务,它就会关闭并删除其中的全部数据。若是但愿数据保留下来,则必须使用"数据卷"进行保存,这须要在主机上进行手动配置。

容器仍是虚拟机

上面咱们列出了容器和虚拟机各自的优点和劣势,咱们在由于优点选择了其一后默认就要其忍受劣势所带来的反作用,凡事都有两面性没有东西能够只有优势没缺点的。就容器和虚拟机来讲,由于其完整的隔离和安全性虚拟机一般用于要求苛刻的应用程序,网络基础结构以及将消耗VM大部分资源的应用程序。而容器一般用于Web应用,微服务。

本文使用 mdnice 排版

相关文章
相关标签/搜索