云原生相关的技术,成体系的书籍和课程网上已经有不少了,一个一个概念按部就班地讲相信并不是大家想要的,直接去看书或者看课就好了。
我想着干脆用聊天的方式和大家从头到尾慢慢讲吧,力求技术的准确性和讲解的深入浅出,这样你们也有收获,我写得也更放松更迅速,效果更好。
GO!
在大部分人眼里,包括我。
云原生就是 Docker,Docker 就是容器。
容器的底层原理就是俩八股文的技术 namespace 和 cgroup,其他的就不知道了,于是容器的学习基本就止步于此,毫无头绪。
我就好奇几个事儿,容器的本质到底是啥?
如果就简简单单是 Linux 本身的一些机制组合实现的东西那为什么这么火?为什么以前不火现在火?既然容器是轻量级的虚拟机,而且实现起来看似也比虚拟机简单,那为什么不是先有容器再有虚拟机呢?
我之前刚好闲着无聊写了一个时间轴渲染的 HTML 页面,把互联网的一些大事儿写了进去。现在正好借着这个工具,我把容器相关的技术时间线也列了进去,并且加粗显示出来,看看它们在互联网发展过程中的位置。
这张图可以看出几点你之前可能不知道的事情。
第一个里程碑意义的虚拟机技术 VMware Workstation 1.0 在 1999 年就发布了。随后 Linux 分别引入了 namespace 和 cgroup 机制,这就过了 7 年多。有了这俩技术后 LXC(Linux Containers)概念很快在 2008 年出现了,并逐步出现了很多命令行工具和 API,这时候容器的概念和实现就已经出来了。
也就是说,如果容器技术真的是不论在哪个时代背景下都是划时代的技术的话,那早在 2008 年 LXC 出来的时候就应该火了。
都说 Docker 底层原理是namespace 和 cgroup,我当时就误以为 Docker 是第一个使用这俩技术组合玩出花来的东西,所以火了。
但实际上第一个 Docker 的版本几乎是在 LXC 出现后的 5 年也就是 2013 年才开源发布,而且那个时候 Docker 里面是直接使用 LXC 现成的工具来创建容器,用现在的话说就是套壳。
完全不是什么创新的玩法。
容器技术真正火起来的原因,我认为是它的镜像技术。因为它真正解决了用户不单单想把应用程序和执行脚本打包起来(这个在虚拟机时代已经被云服务提供商很好地实现了),还想把整个环境也打包起来这个痛点,真正做到了本地和云端完全一样,且不用重复配置环境。
而为什么在 2013 这个时间点火?
一方面是这个时候 Docker 发布了而且解决了刚刚说的痛点,那追问一句为什么那个时候有这个痛点呢?
我觉得是 2013 之前和之后是 PC 互联网向移动互联网过渡的标识,互联网应用慢慢开始爆发式增长,到 2014 年中国的手机网民首次超过了 PC。
可以回到刚刚的图看下 Docker 前后的时代背景。
以前的用户或者企业 web 服务也不多,搞一台虚拟机慢慢在上面玩就行了,配个环境可能也就一两次的事儿。
但是当应用规模和用户流量规模都起来了之后,那就越来越有迫切的需求快速从头到尾部署一个服务,而且还需要快速迭代,一周甚至一天就要根据市场变化出个版本(想想当时的打车、外卖、社交、支付等各领域的烧钱大战),这个时候痛点才开始慢慢出现。
所以打包「应用程序」+「部署脚本」,再加上个打包「整个环境」,后者的需求慢慢变迫切了,正好这时候 Docker 也出了。
至于说容器比虚拟机更轻量,只是另一个小优势罢了。很多文章讲虚拟机太重了耗资源太大了因此慢慢容器技术开始火了起来,一方面容易让人误解容器火的根本原因是因为消耗资源更少,另一方面也让人困惑为什么消耗资源更大且技术更难的虚拟机先出现,而后才有的容器。
实际上像上面那样看一眼技术发展的历史就明白了,容器相比于虚拟机来说是个很简单的东西,而且早就出现了,只不过当时的人并不需要,也不屑于去花时间研究和扩展生态罢了。
---
第一篇不聊太多,上面所说的 VM、namespace、cgroup、LXC、容器、镜像,以及时间轴上出现的LibContainer、RunC、Kubernetes、OCI、CNCF、Containerd 这些东西都是啥?你现在通通都不需要知道。
只要你读完本篇文章后,对你以前所认识的 Docker 以及一些困惑的事情有所启发,并且对把这些乱七八糟的东西了解清楚有了学习的动力,就足够了。整个系列我会和你逐步通过聊天的方式,把这些东西搞清楚。