Docker为什么这么好用

Docker之前的后端领域

那时应该在 2013 年左右,后端已经太久没有出现过令人兴奋的东西了。概念炒了很久、被人们寄予厚望的云计算技术,并不如设想的那般好用和方便。为什么这么说呢?
以当时的 PaaS 佼佼者 CloudFundry 为例,它提供了一种名叫“应用托管”的能力,说白了就是开发人员只需要上传应用程序代码和数据,使用平台提供的能力:cf push $应用即可部署项目。
Cloud Foundry 为每种主流编程语言都定义了一种打包格式,而cf push的作用,基本上等同于用户把应用的可执行文件和启动脚本打进一个压缩包内,上传到云上 Cloud Foundry 的存储中。接着,Cloud Foundry 会通过调度器选择一个可以运行这个应用的虚拟机,然后通知这个机器把应用压缩包下载下来启动。
这时候关键来了,由于需要在一个虚拟机上启动很多个来自不同用户的应用,Cloud Foundry 会调用操作系统的 Cgroups 和 Namespace 机制为每一个应用单独创建一个称作“沙盒”的隔离环境,然后在沙盒中启动这些应用进程。
通过上面的操作,Cloud Foundry 实现了把多个用户的应用互不干涉地在虚拟机里批量地、自动地运行起来的目的。这正是 PaaS 项目最核心的能力,而 Cloud Foundry 用来运行应用的隔离环境,或者说“沙盒”,就是所谓的容器
看起来很方便是吧!而事实并非如此。
前面已经介绍过,PaaS 之所以能够帮助用户大规模部署应用到集群里,是因为它提供了一套应用打包的功能。可偏偏就是这个打包功能,却成了 PaaS 日后不断遭到用户诟病的一个软肋
出现这个问题的根本原因是:一旦用上了 PaaS,用户就必须为每种语言、每种框架,甚至每个版本的应用维护一个打好的包。这个打包过程,没有任何章法可循,更麻烦的是,明明在本地运行得好好的应用,却需要做很多修改和配置工作才能在 PaaS 里运行起来。而这些修改和配置,并没有什么经验可以借鉴,基本上得靠不断试错,直到你摸清楚了本地应用和远端 PaaS 匹配的“脾气”才能够搞定。
最后结局就是,cf push确实是能一键部署了,但是为了实现这个一键部署,用户为每个应用打包的工作可谓一波三折,费尽心机。

Docker为什么这么好用

通过上文我们知道,容器不是 Docker 独创的概念,而 Docker 实际上跟 Cloud Foundry 的容器也并没有太大不同。在它发布后不久,Cloud Foundry 的首席产品经理 James Bayer 就在社区里做了一次详细对比,告诉用户 Docker 实际上只是一个同样使用 Cgroups 和 Namespace 实现的“沙盒”而已,没有什么特别的黑科技,也不需要特别关注。然而,短短几个月,Docker 项目就迅速崛起了。它的崛起速度如此之快,以至于 Cloud Foundry 以及所有的 PaaS 社区还没来得及成为它的竞争对手,就直接被宣告出局了。
事实为何会如此啪啪打脸呢?

Docker镜像的威力

Docker 实现的容器有一点小小的创新:Docker 镜像,其解决的恰恰就是“打包”这个根本性的问题。
所谓 Docker 镜像,其实就是一个压缩包。但是这个压缩包里的内容,比 PaaS 的应用可执行文件+启停脚本的组合就要丰富多了。实际上,大多数 Docker 镜像是直接由一个完整操作系统的所有文件和目录构成的,所以这个压缩包里的内容跟你本地开发和测试环境用的操作系统是完全一样的。
这就有意思了:假设你的应用在本地运行时,能看见的环境是 CentOS 7.2 操作系统的所有文件和目录,那么只要用 CentOS 7.2 的 ISO 做一个压缩包,再把你的应用可执行文件也压缩进去,那么无论在哪里解压这个压缩包,都可以得到与你本地测试时一样的环境。当然,你的应用也在里面!
这就是 Docker 镜像最厉害的地方:只要有这个压缩包在手,你就可以使用某种技术创建一个“沙盒”,在“沙盒”中解压这个压缩包,然后就可以运行你的程序了。更重要的是,这个压缩包包含了完整的操作系统文件和目录,也就是包含了这个应用运行所需要的所有依赖,所以你可以先用这个压缩包在本地进行开发和测试,完成之后,再把这个压缩包上传到云端运行。在这个过程中,你完全不需要进行任何配置或者修改,因为这个压缩包赋予了你一种极其宝贵的能力:本地环境和云端环境的高度一致!这,正是 Docker 镜像的精髓。
依靠 Docker,我们不需要精通 TCP/IP,也无需深谙 Linux 内核原理,哪怕只是一个前端或者网站的 PHP 工程师,都可以把自己的代码打包成一个随处可以运行的 Docker 镜像。

总结

本文我们了解了 Docker 的前世今生以及 Docker 是如何凭借着 Docker 镜像爆火全球。后面的系列内容中,我们会学会 Docker 的基本架构、基本操作、如何制作镜像、打包镜像、分享惊喜、如何使用 Docker 部署项目,Docker 的实现原理等等内容。敬请期待!