Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。Docker可以自动化打包和部署任何应用、创建一个轻量级私有PaaS云、搭建开发测试环境、部署可扩展的Web应用等。
在本文中,我们对比了Docker与目前流行的几个容器如Chef、LXC、Vagrant、Ansible的各方面性能,我们一起来看看到底谁才是容器中的“战斗机”。
使用 Docker和 Chef吧。这些轻量级的工具非常易于使用,而且能给你的多服务器环境带来结构性改善。不过 Docker 和 Chef 的实现方法大不相同。接下来会一一介绍。
它们是什么
Docker 发端于一个名为 dotcloud 的开源项目;随着编写者不断挖掘它的潜力,它迅速变成了一个炙手可热的项目。它由 GO 语言编写的,并且只支持 Linux。它基于 Linux 容器(LxC)来创建一个虚拟环境。请注意:虚拟环境 VE ( Virtual Environment ) 和 虚拟机( VM )很不一样。虚拟机是由虚拟工具或者模拟器( HyperV 、 VMWare 等)创建的,是一个全镜像的主机源,其中包括操作系统、硬盘调整、网络和虚拟进程。过于臃肿的结构吃掉了大量的硬盘空间同时拖慢了运行和开机速度。
译者注: LXC是一个 Linux 提供的收容功能接口,通过 LXC 提供的 API 和简单的工具,使得 Linux 用户可以简单的创建和管理系统或者应用的空间。
Docker 通过自己与操作系统内核相分离的特点很好的解决了这个问题。它会首先创建一个与机器内核相分离的 “等级0” 包裹。任何之后的改变都被保存为 namespace 的快照,并且像虚拟系统那样在单独的容器内运行。“快照”只捕捉“基本模版”的改动,而不是整个机器上面的设置(不像是VM的快照功能)。从这一点我们可以看出 namespace 能够储存并在部署了 Docker 的主机中创建完整环境。
Chef 是一个 CM 工具。它和 Puppet并列为 CM 工具系列中最常用组件。它最初在2009年发布,能够非常简便地对改变进行回滚、配置新机器,因此管理员和开发者使用它来管理机器环境。 Chef 完全支持 Windows 和 Linux 以及 Unix, 并且也有值得夸奖的 GUI (虽然不像 Puppet 的那么平滑)。不过也有人抱怨说 Chef 对于新手来说并不好理解,同时文档让使用者、特别是新手非常头疼。
Chef 是使用“主机-代理”结构,通过中心的主机服务器对于其他的数台安装在其他服务器节点上的代理进行协调和发送指令。这个代理( agent )可以通过使用轻量级工具和 SSH 在服务器端进行简易的部署。通过使用基于 Ruby 的 DSL ,所有的管理可通过 GUI 或 CLI 实现。这个 GUI 非常有用,但是当你遇到很复杂的任务的时不可避免的需要学习 Ruby 。Chef 和其它的 CM 工具一样,使用 结构-等于-代码 的模式进行工作。这也就意味着所以的基础节点的管理必须通过 Ruby 代码来实现。首先定义你需要的修改,之后选定将这些修改应用在哪些机器上,剩下的事情交给 Chef 的服务器做就好了。举个例子,如果你需要将所有 Windows 2008 服务器中的 .Net 2.0 升级到 .Net 3.0 ,你就可以把这个修改定义到你的 Chef 服务器上,之后 Chef 服务器将会进行回滚。有一点需要注意: Chef 对于主机到代理的推送的实现还是属于比较初级的阶段,因此建议你周期性的进行检查看看主机节点是否在代理节点上实施了更改。毫无疑问,这个缺点一直困扰着 Chef 开发者,并且悬而未决。
Chef 的配置被打包在 JSON 文件中并被称作“ cookbook ”。这个软件运行在“客户端-服务器”模式时叫做 Chef-server ,而当它运行在单一模式的时候被称作“ Chef-solo ”。 Chef 的部分吸引力来自于大量的 cookbook 已经被创建并且被免费分享在网络上。
结论
那么 Docker 和 Chef 到底哪个更好呢?面对这种复杂的选项,答案是“看情况”——根据你所想要得到的效果和对工具的信任程度进行选择。当 Chef 这个项目经历了长期测试和考验的时候, Docker 只是一个新兴项目,并且创始人还在犹豫是将其应用于生产环境中的时候。但是 Docker 和 Chef 可以相互补充,Docker 的优势在于快速配置新服务器,而 Chef 则能恢复一些机器上已经存在的改变,后者是 Docker 无法做到的。另外,Docker 是创造新的只读服务器实例时的完美选择,这其中包括创建一个全新的服务器的。