【摘要】各类虚拟机技术开启了云计算时代;而Docker,做为下一代虚拟化技术,正在改变咱们开发、测试、部署应用的方式。那虚拟机与Docker究竟有何不一样呢?前端
首先,你们须要明确一点,Docker容器不是虚拟机。数据库
当我第一次接触Docker的时候,我把它比作一种轻量级的虚拟机。这样作无可厚非,由于Docker最初的成功秘诀,正是它比虚拟机更节省内存,启动更快。Docker不停地给你们宣传,"虚拟机须要数分钟启动,而Docker容器只须要50毫秒"。编程
然而,Docker容器并不是虚拟机,咱们不妨来比较一下它们。后端
使用虚拟机运行多个相互隔离的应用时,以下图:服务器
从下到上理解上图:编程语言
基础设施(Infrastructure)。它能够是你的我的电脑,数据中心的服务器,或者是云主机。测试
主操做系统(Host Operating System)。你的我的电脑之上,运行的多是MacOS,Windows或者某个Linux发行版。云计算
虚拟机管理系统(Hypervisor)。利用Hypervisor,能够在主操做系统之上运行多个不一样的从操做系统。类型1的Hypervisor有支持MacOS的HyperKit,支持Windows的Hyper-V以及支持Linux的KVM。类型2的Hypervisor有VirtualBox和VMWare。spa
从操做系统(Guest Operating System)。假设你须要运行3个相互隔离的应用,则须要使用Hypervisor启动3个从操做系统,也就是3个虚拟机。这些虚拟机都很是大,也许有700MB,这就意味着它们将占用2.1GB的磁盘空间。更糟糕的是,它们还会消耗不少CPU和内存。操作系统
各类依赖。每个从操做系统都须要安装许多依赖。若是你的的应用须要链接PostgreSQL的话,则须要安装libpq-dev;若是你使用Ruby的话,应该须要安装gems;若是使用其余编程语言,好比Python或者Node.js,都会须要安装对应的依赖库。
应用。安装依赖以后,就能够在各个从操做系统分别运行应用了,这样各个应用就是相互隔离的。
使用Docker容器运行多个相互隔离的应用时,以下图:
主操做系统(Host Operating System)。全部主流的Linux发行版均可以运行Docker。对于MacOS和Windows,也有一些办法"运行"Docker。
Docker守护进程(Docker Daemon)。Docker守护进程取代了Hypervisor,它是运行在操做系统之上的后台进程,负责管理Docker容器。
各类依赖。对于Docker,应用的全部依赖都打包在Docker镜像中,Docker容器是基于Docker镜像建立的。
应用。应用的源代码与它的依赖都打包在Docker镜像中,不一样的应用须要不一样的Docker镜像。不一样的应用运行在不一样的Docker容器中,它们是相互隔离的。
Docker守护进程能够直接与主操做系统进行通讯,为各个Docker容器分配资源;它还能够将容器与主操做系统隔离,并将各个容器互相隔离。虚拟机启动须要数分钟,而Docker容器能够在数毫秒内启动。因为没有臃肿的从操做系统,Docker能够节省大量的磁盘空间以及其余系统资源。
说了这么多Docker的优点,你们也没有必要彻底否认虚拟机技术,由于二者有不一样的使用场景。虚拟机更擅长于完全隔离整个运行环境。例如,云服务提供商一般采用虚拟机技术隔离不一样的用户。而Docker一般用于隔离不一样的应用,例如前端,后端以及数据库。