Docker核心解决的问题是利用LXC来实现类似VM的功能,是无硬件的虚拟机。

差异点

与LXC的不同

LXC,一般指Linux Container,即内核容器技术的简称。它允许其他一些沙盒进程运行在一块相对独立的空间,并且能够方便的控制他们的资源调度。Docker不是LXC的一个替代方案,Docker在内核容器技术(Cgroup和Namespace)的基础上,提供了一个更高层的控制工具。

与虚拟机的不同

容器与虚拟机是互补的。虚拟机是用来进行硬件划分的完美解决方案,它利用了硬件虚拟化技术,例如VT-x,AMD-V会同时通过一个hypervisor层来实现对资源的隔离;而容器则是操作系统级别的虚拟化,利用的是内核的Cgroup和NameSpace特性,此功能完全通过软件来实现,仅仅是进程本身就可以与其他进程隔开,不需要任何辅助。

Docker容器与主机共享操作系统内核,不同容器之间可以共享部分系统资源,因此容器更加轻量级,消耗的资源也更少。而虚拟机会独占分配给自己的资源,几乎不存在资源共享,各个虚拟机之间近乎完全隔离,虚拟机更加重量级,也会消耗更多的资源。

我们可以很轻松地在一台物理机上运行100个或者更多的呃Docker容器,而且不会占用太多系统资源(如果Docker占用资源不多);而在单台机器上不可能创建100台虚拟机,因为每一个虚拟机实例都会占用一个完整的操作系统所需要的所有资源。另外,Docker容器启动很快,通常是秒级甚至是毫秒级启动。而虚拟机的启动虽然会快于物理机,但是也是在数秒级甚至数十秒级。

Docker的特性

可移植性

可移植的跨机器部署。Docker定义了一个将应用打包的规范,而它的所有依赖都被封装到了一个简单对象里,它可以被传输到任意一台能运行Docker的机器,并且在这里启动Docker的实例之后,它能够确保承载应用的执行环境将会与之前所定义的完全一致。

Lxc实现了进程级的沙盒封装,它是可移植部署的一个重要前提,但是要想实现可移植部署,仅仅是这样可还不够。

Docker为这些机器的特定配置定义了一个抽象层,所以它使得这些相同的Docker容器能够一成不变的运行在多个不同的主机上,甚至带上各种不同的配置。

以应用为中心

相对于机器而言,Docker被用于优化应用的部署过程。这可以从它的API、UI、设计理念还有文档里得到体现。反之,lxc的辅助脚本专注在把容器作为一个轻量级的机器使用 —— 基本上就是一堆启动更快并且内存需求更小的服务器。我们认为容器技术的内容远远不止这些。

自动化构建

Docker为开发人员引入了一个可以用来把他们的源代码自动打包到容器里的工具,并且他们能够对于应用的依赖,构建工具,打包服务等有着完全的自主掌控能力。他们能够自由的使用make、Maven、Chef、Puppet、salt、debian包、RPM包,源码包,或者任意以上的结合,而无需关心机器本身的配置。

版本控制

Docker引入了一个类似git的特性来完成一个容器的连续版本追踪,版本之间的差异diff,新的版本的提交,回滚等。历史记录信息里也包含了容器的用户信息以及他是如何构建它的,因此生产环境的服务器你都有充足的手段去一步步的定位到最上游的开发人员。Docker也实现了一个增量上传和下载功能,类似于git pull,所以更换到新版本的容器只需要传输增量部分就行。

组件重用

任意容器都能用作“基础镜像”来创建更特定的组件。这可以手工完成也可以做成自动构建的一部分。例如,你可以准备一个理想的Python环境,并且把它用作10个不同的应用的基础镜像。你所定义的标准PostgreSQL设置可以被将来你手上的所有项目重用。诸如此类。

镜像共享

Docker 有权访问一个公共的注册中心(https://hub.docker.com/)而这里有数以千计的业界人士上传各种各样有价值的容器:任一从Redis、Couchdb、Postgres到irc bouncers再到Rails应用服务器,Hadoop甚至是多个发行版本的基础镜像。该注册中心也包含了一个官方的“标准库”,这里提供了一些由Docker官方团队维护的实用容器。注册中心本身也是开源的,所以任何人都能部署他们自己的私有注册中心来存储和下发私有容器,例如用于内网服务器的部署。

工具生态系统

Docker定义了一个API来自动化和个性化的创建和部署容器。也因此催生了众多的工具集成到Docker,为之提供一些扩展特性。类PaaS的部署(Dokku、Deis、Flynn),多节点编排(Maestro、Salt、Mesos、OpenStack Nova),管理看板(Docker-UI、OpenStack Horizon、Shipyard),配置管理(Chef、Puppet),持续集成(Jenkins、Strider、Travis)等等。Docker正在迅速的建立以它本身为标准的基于容器的工具生态圈。