虚拟机(VM)是对某种计算机操做系统的模拟,虚拟机的实现是基于计算机虚拟化的架构和指令,具体可能须要特定的硬件、软件、或软硬件同时的支持。在本文中希云将为你们揭晓Docker容器和全虚拟化之间的区别。docker
Docker是一个建立封装好的隔离计算机环境,每一个封装好的环境都被称为容器。架构
启动一个Docker容器很是迅速,由于:spa
每一个容器共享宿主系统的内核操作系统
然而,各个容器都运行着一个Linux的副本翻译
这意味着没有hypervisor,并且不须要额外的启动进程
对比之下,KVM, VirtualBox 或者 VMware之类的虚拟机实现是不一样的。ip
宿主系统 vs 客户系统资源
若是是安装在虚拟机上,客户系统能够与宿主系统不一样get
若是是安装在一个磁盘分区上,客户系统必须与宿主系统相同虚拟机
宿主系统
是直接安装在计算机上的原生系统
客户系统
是安装在一个虚拟机上,或者在宿主机的一个分区上的系统
是一种计算机软件、固件或者硬件,用于建立并运行虚拟机的
一个系统中安装着hypervisor,里边运行着一个或多个虚拟机,这个系统可被定义为宿主机
各个虚拟机被定义为客户机
使用Linux虚拟机去运行容器
基于Linux内核提供的组件构建的(特别是cgroups和namespaces)
不像虚拟机,不须要包含一个独立的操做系统
由Docker建立的一个封闭计算环境
Linux平台上的Docker
非Linux平台上的Docker
是管理容器的持久进程
使用Linux特定的内核特性去实现
全虚拟化的系统分配到的是独有的一组资源,只有极少许的资源会共享,是有更强的隔离性,可是更加剧了(须要更加多的资源)。用Docker容器有弱些的隔离性,可是它们更加轻量,须要更少的资源,因此你能够绝不费力地启动上千个容器。
基本上,Docker容器和全虚拟化VM有着本质上不一样的目标
VM是用于彻底模拟一个外部环境
相反地,容器的系统(或者更准确来讲,是内核)必须与宿主系统一致,并且与容器和宿主间共享着
在一个全虚拟化VM的实现上,Hypervisor主要做用是翻译客户系统和宿主系统之间的指令
每一个虚拟机中,应用以及相关依赖运行在一个完整的操做系统上
若是你须要同时运行不一样的操做系统(如Windows, OS/X 或 BSD),或者须要为特定平台的系统编译程序,那你须要的是一个全虚拟化VM的实现
容器使应用具备可移植性,并能自包含
这意味着没有hypervisor,并且不须要额外的系统启动
容器引擎负责启动或中止容器,这与虚拟机实现中的hypervisor相似
然而,容器中运行的进程与宿主系统的进程是同行级别的,因此不会被相关的hypervisor杀掉
各容器共享着宿主机的内核
各容器共享着宿主机的内核
在本文中,咱们只关注了Linux平台下的Docker实现,换言之,咱们讨论的是排除掉了非Linux平台(也就是Windows,Mac OS X等等),由于Docker守护进程使用特定的Linux内核特性,你不能在Windows 或 Mac OS X直接运行原生的Docker。在非Linux平台上,Docker使用Linux虚拟机去运行容器。