又是一年DockerCon,从14年开始关注Docker,每年的DockerCon都能带来不少惊(hao)喜(wan)的东西,今年的新玩具应该就算是LinuxKit和Moby了。
今天快快的把玩了一下,从yml文件直接打包出一个全新的linux服务器镜像的过程非常简单让人不禁想起了乐高积木,这次在DockerCon上乐高玩具也被多次推到前台,甚至演讲的背景音乐都好像进了街机厅一样。像搭积木一样搭建软件系统,这是多少程序员的梦想,也好像我们从开始写代码的那一刻就觉得这才应该是软件最终的形态…… 而且这事儿看上去也好像没有那么复杂,但当你写了几年代码后才发现,这不过是个美好的故事。今年,我们似乎向这个目标又迈进了一步。
云时代的OS到底会长成什么样子,这个问题其实是多家云厂商都在找寻的方向。大多数的云厂商的做法是将大家常用的操作系统一股脑的放到自己的模版库中。但这里有一个不容忽视的问题:主机时代的操作系统是多用途的,而虚拟化/云计算时代的操作系统则是单一用途的。以前,我们会将多种应用尽量部署在同一台主机上以便节省资源(因为搭建服务器是一个辛苦活),这要求我们的操作系统足够通用化,包含的组件也是向着越来越丰富的方向发展;而虚拟化和云计算兴起以后,我们会尽量在一台主机上只部署单一应用(因为搭建服务变的无比简单),以提升应用部署速度,响应速度和敏捷程度。而原先那种通用化(臃肿)的操作系统就变的不那么合适了,更重要的是,由于那些与应用无关组件的存在,我们必须花费很多不必要的精力来维护这些组件,仅仅是为了能够让我们大楼的地基足够稳固 … … 有没有一种盖好了大楼再拆掉不需要的地基的做法?这其实就是LinuxKit/NanoServer想要解决的问题。
最近几年DevOps风生水起,IT界非常擅长创造各种新概念,而让很多人迷失了我们真正需要些什么。无论是敏捷,精益,DevOps还是持续交付其实我们都在解决同一个问题,那就是效率。
如何才能提高效率,其实基本的思路只有两个:1. 减小粒度,将复杂问题简单化,降低复杂度,减少为了那些过程复杂度所付出的管理成本。2. 解耦,给我们的系统,团队足够自由去按照自己的步调解决问题,减少他们之间的摩擦,让我们投入的资源尽量多的转换成生产力。
大家可能感觉这2个话题和LinuxKit/NanoServer没啥关系,而实际上关系很大。这次Docker的做法是一种降维打击的策略。简单来说,docker就是一种对技术栈进行编排的技术,当前对于对应用层的优化已经到达一定程度了,那么如何迈出下一步就是个大问题,而对操作系统开刀就是个自然的选择。LinuxKit通过一个yml文件对操作系统组件进行描述,允许用户根据自己的需求动态创建OS镜像,这种方式给予了用户从根本上控制应用系统技术栈的能力。底层的依赖减少了,问题自然少了,运行速度,出错几率和安全性都会得到优化。这其实将复杂问题简单化的一种方式。同时,因为依赖变少,和其他组件的耦合程度也降低。
我们再看一下NanoServer,这是微软在Server 2016中所提供的一个全新的操作系统发行版,它同样允许用户根据自己的需要选择所需要的组件,并动态生成一个专用的操作系统版本。下面这张图是Nano Server Image Builder中用来选择操作系统组件的配置界面:
下面这个是一个linuxkit.yml文件,同样是用来对操作系统进行组装:
一个linuxkit.yml文件
是不是有种殊途同归的感觉,有了这样的工具,我们不仅仅可以为我们的应用定制操作系统,而且这个操作系统还会变的非常的小,启动也更加迅速,更加适合云时代的操作系统特点。像Win Server这样的系统都可以做到400M的体积和40秒的启动速度:
Win Server
使用linuxkit更加可以制作出60M左右的操作系统镜像
这才是使用云时代的操作系统的正确姿势,这一次,微软和Docker又想到一起去了。其实我们永远要记住一点,我们要的不是操作系统,我们要的是上面的应用。盖好了大楼然后拆掉地基这种事情可能也只有在软件行业才能做到了。