Docker 项目的目标是实现轻量级的操做系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。linux
在 LXC 的基础上 Docker 进行了进一步的封装,让用户不须要去关心容器的管理,使得操做更为简便。用户操做 Docker 的容器就像操做一个快速轻量级的虚拟机同样简单。redis
做为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具备众多的优点。docker
1. Docker 容器的启动能够在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker 对系统资源的利用率很高,一台主机上能够同时运行数千个 Docker 容器。服务器
2. 容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽可能小。传统虚拟机方式运行 10 个不一样的应用就要起 10 个虚拟机,而Docker 只须要启动 10 个隔离的应用便可。网络
3. 虚拟化技术依赖物理CPU和内存,是硬件级别的;而docker构建在操做系统上,利用操做系统的containerization技术,因此docker甚至能够在虚拟机上运行。架构
4. 虚拟化系统通常都是指操做系统镜像,比较复杂,称为“系统”;而docker开源并且轻量,称为“容器”,单个容器适合部署少许应用,好比部署一个redis、一个memcached。框架
5. 传统的虚拟化技术使用快照来保存状态;而docker在保存状态上不只更为轻便和低成本,并且引入了相似源代码管理机制,将容器的快照历史版本一一记录,切换成本很低。运维
6. 传统的虚拟化技术在构建系统的时候较为复杂,须要大量的人力;而docker能够经过Dockfile来构建整个容器,重启和构建速度很快。更重要的是Dockfile能够手动编写,这样应用程序开发人员能够经过发布Dockfile来指导系统环境和依赖,这样对于持续交付十分有利。memcached
7. 固然KVM对比于容器也有一个比较大的优点就是可使用不一样的操做系统或内核。因此,举例说,你可使用微软Azure,同时运行Windows Server2012的实例和SUSE Linux企业级服务器的实例。至于Docker,全部容器都必须使用一样的操做系统和内核。性能
具体说来,Docker 在以下几个方面具备较大的优点。
对开发和运维(devop)人员来讲,最但愿的就是一次建立或配置,能够在任意地方正常运行。
开发者可使用一个标准的镜像来构建一套开发容器,开发完成以后,运维人员能够直接使用这个容器来部署代码。 Docker 能够快速建立容器,快速迭代应用程序,并让整个过程全程可见,使团队中的其余成员更容易理解应用程序是如何建立和工做的。 Docker 容器很轻很快!容器的启动时间是秒级的,大量地节约开发、测试、部署的时间。
Docker 容器的运行不须要额外的 hypervisor 支持,它是内核级的虚拟化,所以能够实现更高的性能和效率。
Docker 容器几乎能够在任意的平台上运行,包括物理机、虚拟机、公有云、私有云、我的电脑、服务器等。这种兼容性可让用户把一个应用程序从一个平台直接迁移到另一个。
使用 Docker,只须要小小的修改,就能够替代以往大量的更新工做。全部的修改都以增量的方式被分发和更新,从而实现自动化而且高效的管理。
特性 |
容器 |
虚拟机 |
启动 |
秒级 |
分钟级 |
硬盘使用 |
通常为 MB |
通常为 GB |
性能 |
接近原生 |
弱于 |
系统支持量 |
单机支持上千个容器 |
通常几十个 |
LXC是基于cgroup等linux kernel功能的,所以container的guest系统只能是linux base的
隔离性相比KVM之类的虚拟化方案仍是有些欠缺,全部container公用一部分的运行库
网络管理相对简单,主要是基于namespace隔离
cgroup的cpu和cpuset提供的cpu功能相比KVM的等虚拟化方案相比难以度量(因此dotcloud主要是安内存收费)
container随着用户进程的中止而销毁,container中的log等用户数据不便收集
另外,Docker是面向应用的,其终极目标是构建PAAS平台,而现有虚拟机主要目的是提供一个灵活的计算资源池,是面向架构的,其终极目标是构建一个IAAS平台,因此它不能替代传统虚拟化解决方案。目前在容器可管理性方面,对于方便运维,提供UI来管理监控各个containers的功能还不足,还都是第三方实现。由于容器技术自己更适于解决大规模应用场景,因此一般都是集群基础上的部署、运维,可是目前对这一系列任务的自动化处理尚无统一的或者标准的框架。若是要让Docker真正在实际环境中发挥最大的效能而且易于维护,就须要有成熟稳定的资源编排(orchestration)、资源调度(scheduling)和部署(deployment)的支持,可是这方面暂时尚未很明显的最佳解决方案,因此大多数人都在摸索和搭建本身的解决方案。