摘要: 在云栖TechDay34期:DockerCon2017最新的技术解读中,阿里巴巴技术专家王炳燊为大家解读了在DockerCon2017中新发布的Moby项目和Linuxkit项目,为大家详细地介绍了Moby与Docker的区别,以及Linuxkit的优势所在,并通过示例介绍了如何利用Moby工具和Linuxkit定制容器系统。
摘要:在云栖TechDay34期:DockerCon2017最新的技术解读中,阿里巴巴技术专家王炳燊为大家解读了在DockerCon2017中新发布的Moby项目和Linuxkit项目,为大家详细地介绍了Moby与Docker的区别,以及Linuxkit的优势所在,并通过示例介绍了如何利用Moby工具和Linuxkit定制容器系统。
以下内容根据演讲嘉宾现场视频以及速记整理而成。
演讲嘉宾介绍:
王炳燊(花名:溪恒),具有丰富的Linux开发经验,对Docker技术有深入研究,多次提交Docker Patch。之前从事阿里云容器服务网络方案的设计与实现,专注于容器技术的基础环境研究。
本次分享主要围绕以下三个方面:
- 为什么产生Moby项目
- Linuxkit项目
- 利用Moby工具和Linuxkit定制容器系统
本次分享会对Docker在DockerCon里面发布的争议比较多的两个新项目——Moby和Linuxkit做一些分析。大家都知道在DockerCon上,Docker公司把Docker项目改名成了Moby,并且发布了Linuxkit项目。所以在本次分享中,首先会介绍一下Moby项目,然后再介绍一下Linuxkit项目,最后再结合这两个项目去构建自己的一个容器系统。
一、为什么产生Moby项目
在DockerCon的时候,Docker公司前CEO Solomon改了PR之后,在官方PR上面可以看到很多的“黑人问号”表情,大家对Docker的这个行为十分不看好,认为Docker就是改名成了Moby,以后Docker Run是不是就是通过Moby去Run,Docker是不是以后就变成一个商业化产品了,大家对这些问题不是很了解。在很多QQ交流群里面,大家也是不明白这件事情,就以为Docker改名成了Moby。其实在后面对于Docker的介绍中,说明了为了和更多的场景适配,所以把Docker里面的场景化的东西都抽象到Moby这个项目中,用来构建一个更加完善的生态系统。
为什么会产生Moby这个项目呢?可以看到最近几年里面,在2015年之后的Docker 1.17版本之后,引入了很多的新特性,比如Network、runC等,Docker的组件越来越多,提供支持的场景也越来越复杂,比如微服务、机器学习、物联网等,所以Docker镜像的下载量也呈现指数型上升,最终Docker运行的环境,也是越来越复杂,越来越多,比如在Linux,Windows,还有在嵌入式设备上。
所以Docker原本的发行版本已经不能适配于这些越来越复杂的场景了,举个例子,其实在IoT里面,树莓派的性能是比较好的,但是它去运行Docker的话,Docker就会占整个性能的一大部分,这样它上面就已经无法运行其他的一些自己的应用了,那用户要怎么去解决这些事情,难道自己去再写一个Docker容器引擎吗?这个成本是很高的,需要自己去造轮子。所以为了提供更加开放的生态,Docker公司把Docker项目中现在的一些组件抽象成Moby项目,这样系统构建者就可以通过Moby项目把现有的组件去进行组装,然后组装成自己所需要的一个容器引擎。
Moby项目现在有80多个组件,通过这些组件,用户可以避免重复地去造轮子。用户可以按照自己的需要去组装组件,做出自己的一个容器系统。这些组件有一个标准化的调用方式,他们之间通过gRPC通信,它的语言也是可以去定制的,不会像之前一样必须用Go语言去写。通过标准化的方式,通过Moby这个项目就可以把这些组件进行组合,成为自己所依赖的容器系统。
Moby项目的整个结构设计如下图所示。Moby里面会提供一个组件库的接口,这些组件就去实现这个组件库的接口,这些组件都是可以替换的,可以在不同的平台上有不同的实现。通过Moby的工具去把这些组件库的接口进行组装,比如现在Docker依赖了网络和Runtime这两个组件,然后就把这两个组件组装到一起,再去构建出来一个软件就是Docker。可能不需要依赖于很多Docker组件,就可以做出自己所需要的一个容器系统。
拿汽车发展史打个比方,最开始时就像是板车,整个系统由一个人完成,每个组件都要很紧密地耦合在一起,在Docker1.7之前就是这样子,只有单个的项目。在1.7之后它像老式汽车一样,很多东西会分到不同的厂房中去生产,最终去组装出来一个自己产品,当然这种方式只是说这些产品是分开制作的,不会相互影响,但是也没有做到很通用,在更多的场景中没有办法去适配。所以最终就会发展成现在这种汽车或者是说更广泛的应用场景,就是首先零件工厂去生产自己的零件,然后中间的组装工厂去采购不同的零件去组装成自己所需要的产品,这相当于Docker里面Moby项目。
Moby会带来哪些好处呢?首先它会提供更开放的生态,之前Docker的组件分布在不同的项目中,这样组件就可以单独去捐献给一些基金会,比如说containerd已经捐献给了CNCF,有了Moby这个生态之后,后续也会有更多的组件捐献给基金会,会为开发者提供更加开放的生态。其次可以通过不同的语言构建组件,因为组件之间是通过标准化的gRPC通信的,组件之间也允许客户通过自己的需求去定制不同的容器系统,比如说在IoT的环境下,用户就可以只把Runtime和网络去组装成一个它自己的容器系统,而不会受到Docker的限制。
大家最关心的是这会对Docker产生什么影响,Docker是不是变成了一个闭源的产品,以后会不会想要使用Docker就得买了。其实Docker官方也给出了下面的这个图,意思就是Docker项目现在改名成Moby项目,但是Docker会逐渐的从Moby项目中去抽象和剥离出来,作为Moby的一种组装方式,比如Docker依赖于这里面的一些库,它就特化成一种组装,组装成自己的Docker CE的版本,也就是Docker的社区版。Docker社区版后面也会继续做开源,所以用户和开发者不需要担心以后用Docker就会收费了,对于Docker用户来说,他也无须感知用户接口的变化,使用的命令还是Docker不是Moby,需要更多运维支持的可以选择Docker EE的版本,让Docker公司的工程师去替你去做运维和更复杂的线上支持,如果自己开发可以继续选择Docker社区版。对于架构师而言,现在就可以不强依赖于Docker项目,而是通过这些组件去拼装出来一个容器引擎去满足自己的需求。
二、Linuxkit项目接下来看一下最新发布组件——Linuxkit。Linuxkit是很多公司一起联合发布的容器时代的一个安全、精简、可移植的操作系统,那么它有哪些特性呢?首先Linuxkit是基于Moby构建出来一个操作系统,它可以包含Moby的组件生态,它的系统服务都是以容器方式运行的。可以对比一下以前的传统容器系统架构,就是以前可能在CentOS或者Ubuntu运行起来Docker引擎,在Docker引擎上面来去运行起来自己的服务,在这些容器引擎之外其实是有很多的系统服务,可能根本就使用不到,而他们也带来了很多的风险和系统负载。所以对于现在容器时代的这种操作系统而言,可以去抽象成更精简的系统,就是只有LinuxKit内核和容器引擎,系统服务也可以通过像Docker的应用一样去运行在容器引擎上面提供给整个系统,所有的系统服务也是以容器的方式插拔和升级或替换的。
安全性
这种方式带来哪些好处呢?首先是对操作系统安全性的一个提升,对于很多企业来说,他们都会去买RedHat的系统,因为RedHat系统有官方支持,有很多的安全特性。其实它那些特性对Linuxkit来说是从根本上去就解决了的问题,比如说因为服务都是一些容器,所以在自己的系统中可以只组装需要的一些服务,这些服务也是在容器的沙箱中去运行的,比如说有一个DHCP的服务,它运行的时候可以去指定有哪些权限,就算有一些漏洞,可能它根本就没有权限去对系统去做那些操作,所以也从根本上解决了安全问题。其次如果这个服务真的存在漏洞,而且它能调动网络影响整个操作系统,对它进行升级也很方便,因为它就是一个容器,也可以对它进行替换。最后它的安全性还体现在它是由社区共建的,所有的Linuxkit组件都是开源的,有什么问题都会及时地得到解决。
精简系统
它带来的另一个好处是比较精简。可以看一下正常系统大小,Ubuntu是1.4G,CentOS是680M,Linuxkit的裸系统的大小只有34M,因为它只有Kernel和一个容器引擎,所以系统特别小。而且服务少带来的好处就是启动很快,基本上在2至3秒钟就可以启动起来,这样就可以用到IoT设备上,可以不依赖很多的系统服务,所以它可以很快启动,而且会消耗更少的资源。Linuxkit也可以用到云计算场景上,这主要是看中它的动态可扩展性,比如哪一天要抢红包了,突然来了很多流量,用Linuxkit系统2至3秒钟就可以扩容出来一个实例,就可以更好地去应对。
可移植性
Linuxkit系统可能运行在很多环境上面,比如桌面、服务器以及大型主机等,架构上面可以有英特尔或者ARM,还有就是可能在裸机上或者在云平台的虚拟机上去运行。因为Linuxkit可以使用同一份配置,通过Moby去构建不同的参数去打出来不同的镜像,比如打出来ISO镜像适配于物理机,打出VHD去适配于虚拟机。
三、利用Moby工具和Linuxkit定制容器系统然后看一下实际的描述文件要怎样写。它里面包含几个组件,它的操作系统里面的内核是哪一个镜像,它下面的容器引擎是哪些,然后还有就是下面去描述系统所依赖的服务容器,比如说例子里面加了DHCP,让它可以动态去获取网络配置,然后通过Moby的工具就可以一键去构建出来,还可以构建出不同格式,比如ISO、云平台的RAW和VHD。
下面就是一个通过Moby工具和Linuxkit定制容器操作系统例子。左边是一个操作系统描述,用了一个Redis数据库的服务,导出出来一个ISO格式,通过Moby命令直接去构建镜像,这个镜像的大小只有41M,和其他的操作系统不是一个数量级的。
然后去直接配置它的启动,可以看到它在三秒钟之内就能够启动完成。