在介绍完Docker的原理后,我们再回过头来看Docker的意义。
Docker的意义
事实上,Cgroups是2007年就被合并到Linux内核的功能。那个时候结合了Cgroups的资源管理能力+Linux Namespace的视图隔离能力的LXC(Linux Container)就已经产生了。
但LXC的视角还是操作系统和服务器,目标是打造一个相比虚拟机更轻量级的系统容器。
而Docker从理念上就截然不同,将目标中心转到了应用。
不要小看这个理念上的差异。以应用为中心意味着两件事情的彻底改变:
构建和部署
测试环境和生产环境的构建和部署都是以应用为粒度的。而一个操作系统上可能部署着不同测试阶段的应用。不可能那么凑巧让上面所有的应用恰好同一周期完毕,然后将整个操作系统从测试搬到生产。这个不符合正常的开发测试流程。
而Docker直接将一个应用运行所需的完整环境,即整个操作系统的文件系统也打包了进去。只要这个应用的Docker镜像测试完成,就可以单独发布上生产。还可以利用现有的构建工具来辅助,例如Jenkins/Ansible等。遇到性能瓶颈需要横向扩展时,也可以针对单应用迅速部署启动。在性能压力消除后也可以快速回收。
在Docker之前,也已经有Cloud Foundry等PaaS项目开始以应用为中心。但相比做完一个镜像就可以随处运行的Docker,它们的便利性和适应性差了不少。
版本化和共享
制作一个操作系统容器是一件私有的事情。你制作的操作系统容器一般只会使用在你自己的团队,顶多扩展到全公司内部。别人看不到你是具体怎么做的系统容器,不清楚你是否在里面埋了雷。借我十个胆子也不敢用。
而Docker在容器镜像的制作上引入了“层(Layer)”的概念。这种基于“层”的实现借鉴了Git的思想,使容器的创建变得透明。每个人都可以审查应用容器在原始操作系统的容器上做了哪些修改。
类似在Github上开源代码,当每个人和每个公司都可以参与到全世界的应用容器分发过程中时,Docker的爆发也在情理之中了。