天天看点

【DockerCon2017最新技术解读】使用Moby工具和Linuxkit定制容器系统

<b>摘要:</b>在云栖techday34期:dockercon2017最新的技术解读中,阿里巴巴技术专家王炳燊为大家解读了在dockercon2017中新发布的moby项目和linuxkit项目,为大家详细地介绍了moby与docker的区别,以及linuxkit的优势所在,并通过示例介绍了如何利用moby工具和linuxkit定制容器系统。

<b>以下内容根据演讲嘉宾现场视频以及速记整理而成。</b>

<b>演讲嘉宾介绍:</b>

王炳燊(花名:溪恒),具有丰富的linux开发经验,对docker技术有深入研究,多次提交docker patch。之前从事阿里云容器服务网络方案的设计与实现,专注于容器技术的基础环境研究。

本次分享主要围绕以下三个方面:

为什么产生moby项目

linuxkit项目

利用moby工具和linuxkit定制容器系统

【DockerCon2017最新技术解读】使用Moby工具和Linuxkit定制容器系统

本次分享会对docker在dockercon里面发布的争议比较多的两个新项目——moby和linuxkit做一些分析。大家都知道在dockercon上,docker公司把docker项目改名成了moby,并且发布了linuxkit项目。所以在本次分享中,首先会介绍一下moby项目,然后再介绍一下linuxkit项目,最后再结合这两个项目去构建自己的一个容器系统。

<b></b>

一、为什么产生moby项目

【DockerCon2017最新技术解读】使用Moby工具和Linuxkit定制容器系统

在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,还有在嵌入式设备上。

【DockerCon2017最新技术解读】使用Moby工具和Linuxkit定制容器系统

所以docker原本的发行版本已经不能适配于这些越来越复杂的场景了,举个例子,其实在iot里面,树莓派的性能是比较好的,但是它去运行docker的话,docker就会占整个性能的一大部分,这样它上面就已经无法运行其他的一些自己的应用了,那用户要怎么去解决这些事情,难道自己去再写一个docker容器引擎吗?这个成本是很高的,需要自己去造轮子。所以为了提供更加开放的生态,docker公司把docker项目中现在的一些组件抽象成moby项目,这样系统构建者就可以通过moby项目把现有的组件去进行组装,然后组装成自己所需要的一个容器引擎。

【DockerCon2017最新技术解读】使用Moby工具和Linuxkit定制容器系统

moby项目现在有80多个组件,通过这些组件,用户可以避免重复地去造轮子。用户可以按照自己的需要去组装组件,做出自己的一个容器系统。这些组件有一个标准化的调用方式,他们之间通过grpc通信,它的语言也是可以去定制的,不会像之前一样必须用go语言去写。通过标准化的方式,通过moby这个项目就可以把这些组件进行组合,成为自己所依赖的容器系统。

【DockerCon2017最新技术解读】使用Moby工具和Linuxkit定制容器系统

moby项目的整个结构设计如下图所示。moby里面会提供一个组件库的接口,这些组件就去实现这个组件库的接口,这些组件都是可以替换的,可以在不同的平台上有不同的实现。通过moby的工具去把这些组件库的接口进行组装,比如现在docker依赖了网络和runtime这两个组件,然后就把这两个组件组装到一起,再去构建出来一个软件就是docker。可能不需要依赖于很多docker组件,就可以做出自己所需要的一个容器系统。

【DockerCon2017最新技术解读】使用Moby工具和Linuxkit定制容器系统

拿汽车发展史打个比方,最开始时就像是板车,整个系统由一个人完成,每个组件都要很紧密地耦合在一起,在docker1.7之前就是这样子,只有单个的项目。在1.7之后它像老式汽车一样,很多东西会分到不同的厂房中去生产,最终去组装出来一个自己产品,当然这种方式只是说这些产品是分开制作的,不会相互影响,但是也没有做到很通用,在更多的场景中没有办法去适配。所以最终就会发展成现在这种汽车或者是说更广泛的应用场景,就是首先零件工厂去生产自己的零件,然后中间的组装工厂去采购不同的零件去组装成自己所需要的产品,这相当于docker里面moby项目。

【DockerCon2017最新技术解读】使用Moby工具和Linuxkit定制容器系统

moby会带来哪些好处呢?首先它会提供更开放的生态,之前docker的组件分布在不同的项目中,这样组件就可以单独去捐献给一些基金会,比如说containerd已经捐献给了cncf,有了moby这个生态之后,后续也会有更多的组件捐献给基金会,会为开发者提供更加开放的生态。其次可以通过不同的语言构建组件,因为组件之间是通过标准化的grpc通信的,组件之间也允许客户通过自己的需求去定制不同的容器系统,比如说在iot的环境下,用户就可以只把runtime和网络去组装成一个它自己的容器系统,而不会受到docker的限制。

【DockerCon2017最新技术解读】使用Moby工具和Linuxkit定制容器系统

大家最关心的是这会对docker产生什么影响,docker是不是变成了一个闭源的产品,以后会不会想要使用docker就得买了。其实docker官方也给出了下面的这个图,意思就是docker项目现在改名成moby项目,但是docker会逐渐的从moby项目中去抽象和剥离出来,作为moby的一种组装方式,比如docker依赖于这里面的一些库,它就特化成一种组装,组装成自己的docker ce的版本,也就是docker的社区版。docker社区版后面也会继续做开源,所以用户和开发者不需要担心以后用docker就会收费了,对于docker用户来说,他也无须感知用户接口的变化,使用的命令还是docker不是moby,需要更多运维支持的可以选择docker ee的版本,让docker公司的工程师去替你去做运维和更复杂的线上支持,如果自己开发可以继续选择docker社区版。对于架构师而言,现在就可以不强依赖于docker项目,而是通过这些组件去拼装出来一个容器引擎去满足自己的需求。

【DockerCon2017最新技术解读】使用Moby工具和Linuxkit定制容器系统

<b>二、linuxkit项目</b>

接下来看一下最新发布组件——linuxkit。linuxkit是很多公司一起联合发布的容器时代的一个安全、精简、可移植的操作系统,那么它有哪些特性呢?首先linuxkit是基于moby构建出来一个操作系统,它可以包含moby的组件生态,它的系统服务都是以容器方式运行的。可以对比一下以前的传统容器系统架构,就是以前可能在centos或者ubuntu运行起来docker引擎,在docker引擎上面来去运行起来自己的服务,在这些容器引擎之外其实是有很多的系统服务,可能根本就使用不到,而他们也带来了很多的风险和系统负载。所以对于现在容器时代的这种操作系统而言,可以去抽象成更精简的系统,就是只有linuxkit内核和容器引擎,系统服务也可以通过像docker的应用一样去运行在容器引擎上面提供给整个系统,所有的系统服务也是以容器的方式插拔和升级或替换的。

【DockerCon2017最新技术解读】使用Moby工具和Linuxkit定制容器系统

<b>安全性</b>

这种方式带来哪些好处呢?首先是对操作系统安全性的一个提升,对于很多企业来说,他们都会去买redhat的系统,因为redhat系统有官方支持,有很多的安全特性。其实它那些特性对linuxkit来说是从根本上去就解决了的问题,比如说因为服务都是一些容器,所以在自己的系统中可以只组装需要的一些服务,这些服务也是在容器的沙箱中去运行的,比如说有一个dhcp的服务,它运行的时候可以去指定有哪些权限,就算有一些漏洞,可能它根本就没有权限去对系统去做那些操作,所以也从根本上解决了安全问题。其次如果这个服务真的存在漏洞,而且它能调动网络影响整个操作系统,对它进行升级也很方便,因为它就是一个容器,也可以对它进行替换。最后它的安全性还体现在它是由社区共建的,所有的linuxkit组件都是开源的,有什么问题都会及时地得到解决。

【DockerCon2017最新技术解读】使用Moby工具和Linuxkit定制容器系统

<b>精简系统</b>

它带来的另一个好处是比较精简。可以看一下正常系统大小,ubuntu是1.4g,centos是680m,linuxkit的裸系统的大小只有34m,因为它只有kernel和一个容器引擎,所以系统特别小。而且服务少带来的好处就是启动很快,基本上在2至3秒钟就可以启动起来,这样就可以用到iot设备上,可以不依赖很多的系统服务,所以它可以很快启动,而且会消耗更少的资源。linuxkit也可以用到云计算场景上,这主要是看中它的动态可扩展性,比如哪一天要抢红包了,突然来了很多流量,用linuxkit系统2至3秒钟就可以扩容出来一个实例,就可以更好地去应对。

【DockerCon2017最新技术解读】使用Moby工具和Linuxkit定制容器系统

<b>可移植性</b>

linuxkit系统可能运行在很多环境上面,比如桌面、服务器以及大型主机等,架构上面可以有英特尔或者arm,还有就是可能在裸机上或者在云平台的虚拟机上去运行。因为linuxkit可以使用同一份配置,通过moby去构建不同的参数去打出来不同的镜像,比如打出来iso镜像适配于物理机,打出vhd去适配于虚拟机。

【DockerCon2017最新技术解读】使用Moby工具和Linuxkit定制容器系统

<b>三、利用moby工具和linuxkit定制容器系统</b>

然后看一下实际的描述文件要怎样写。它里面包含几个组件,它的操作系统里面的内核是哪一个镜像,它下面的容器引擎是哪些,然后还有就是下面去描述系统所依赖的服务容器,比如说例子里面加了dhcp,让它可以动态去获取网络配置,然后通过moby的工具就可以一键去构建出来,还可以构建出不同格式,比如iso、云平台的raw和vhd。

【DockerCon2017最新技术解读】使用Moby工具和Linuxkit定制容器系统

下面就是一个通过moby工具和linuxkit定制容器操作系统例子。左边是一个操作系统描述,用了一个redis数据库的服务,导出出来一个iso格式,通过moby命令直接去构建镜像,这个镜像的大小只有41m,和其他的操作系统不是一个数量级的。

【DockerCon2017最新技术解读】使用Moby工具和Linuxkit定制容器系统

然后去直接配置它的启动,可以看到它在三秒钟之内就能够启动完成。

【DockerCon2017最新技术解读】使用Moby工具和Linuxkit定制容器系统

继续阅读