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

本文涉及的产品
容器镜像服务 ACR,镜像仓库100个 不限时长
简介: 在云栖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定制容器系统
515fb84e14253395b7d1a0d50d640f07a79723ab
本次分享会对Docker在DockerCon里面发布的争议比较多的两个新项目——Moby和Linuxkit做一些分析。大家都知道在DockerCon上,Docker公司把Docker项目改名成了Moby,并且发布了Linuxkit项目。所以在本次分享中,首先会介绍一下Moby项目,然后再介绍一下Linuxkit项目,最后再结合这两个项目去构建自己的一个容器系统。

一、为什么产生Moby项目

f0bd8e73b28aef0881e5893e1467c63b1b979678
在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,还有在嵌入式设备上。
1c76dea63151c46958f822b68ad92eab199796a2
所以Docker原本的发行版本已经不能适配于这些越来越复杂的场景了,举个例子,其实在IoT里面,树莓派的性能是比较好的,但是它去运行Docker的话,Docker就会占整个性能的一大部分,这样它上面就已经无法运行其他的一些自己的应用了,那用户要怎么去解决这些事情,难道自己去再写一个Docker容器引擎吗?这个成本是很高的,需要自己去造轮子。所以为了提供更加开放的生态,Docker公司把Docker项目中现在的一些组件抽象成Moby项目,这样系统构建者就可以通过Moby项目把现有的组件去进行组装,然后组装成自己所需要的一个容器引擎。
2d464737098ee55ba0bf5587c16f652514d0f261
Moby项目现在有80多个组件,通过这些组件,用户可以避免重复地去造轮子。用户可以按照自己的需要去组装组件,做出自己的一个容器系统。这些组件有一个标准化的调用方式,他们之间通过gRPC通信,它的语言也是可以去定制的,不会像之前一样必须用Go语言去写。通过标准化的方式,通过Moby这个项目就可以把这些组件进行组合,成为自己所依赖的容器系统。
a5b57df99ffe6be61da50474c705794db4868534
Moby项目的整个结构设计如下图所示。Moby里面会提供一个组件库的接口,这些组件就去实现这个组件库的接口,这些组件都是可以替换的,可以在不同的平台上有不同的实现。通过Moby的工具去把这些组件库的接口进行组装,比如现在Docker依赖了网络和Runtime这两个组件,然后就把这两个组件组装到一起,再去构建出来一个软件就是Docker。可能不需要依赖于很多Docker组件,就可以做出自己所需要的一个容器系统。
135805cdf464eaa09ae3ffdb111246f18c432a76
拿汽车发展史打个比方,最开始时就像是板车,整个系统由一个人完成,每个组件都要很紧密地耦合在一起,在Docker1.7之前就是这样子,只有单个的项目。在1.7之后它像老式汽车一样,很多东西会分到不同的厂房中去生产,最终去组装出来一个自己产品,当然这种方式只是说这些产品是分开制作的,不会相互影响,但是也没有做到很通用,在更多的场景中没有办法去适配。所以最终就会发展成现在这种汽车或者是说更广泛的应用场景,就是首先零件工厂去生产自己的零件,然后中间的组装工厂去采购不同的零件去组装成自己所需要的产品,这相当于Docker里面Moby项目。
591c020884770c80949a58d44c30badc68fd4627
Moby会带来哪些好处呢?首先它会提供更开放的生态,之前Docker的组件分布在不同的项目中,这样组件就可以单独去捐献给一些基金会,比如说containerd已经捐献给了CNCF,有了Moby这个生态之后,后续也会有更多的组件捐献给基金会,会为开发者提供更加开放的生态。其次可以通过不同的语言构建组件,因为组件之间是通过标准化的gRPC通信的,组件之间也允许客户通过自己的需求去定制不同的容器系统,比如说在IoT的环境下,用户就可以只把Runtime和网络去组装成一个它自己的容器系统,而不会受到Docker的限制。
4ee76fed579266c7308be60b50f9a611f9d38a32
大家最关心的是这会对Docker产生什么影响,Docker是不是变成了一个闭源的产品,以后会不会想要使用Docker就得买了。其实Docker官方也给出了下面的这个图,意思就是Docker项目现在改名成Moby项目,但是Docker会逐渐的从Moby项目中去抽象和剥离出来,作为Moby的一种组装方式,比如Docker依赖于这里面的一些库,它就特化成一种组装,组装成自己的Docker CE的版本,也就是Docker的社区版。Docker社区版后面也会继续做开源,所以用户和开发者不需要担心以后用Docker就会收费了,对于Docker用户来说,他也无须感知用户接口的变化,使用的命令还是Docker不是Moby,需要更多运维支持的可以选择Docker EE的版本,让Docker公司的工程师去替你去做运维和更复杂的线上支持,如果自己开发可以继续选择Docker社区版。对于架构师而言,现在就可以不强依赖于Docker项目,而是通过这些组件去拼装出来一个容器引擎去满足自己的需求。
42189d2be93fdb4b2e51e5937006e3b94a58567e
二、Linuxkit项目
接下来看一下最新发布组件——Linuxkit。Linuxkit是很多公司一起联合发布的容器时代的一个安全、精简、可移植的操作系统,那么它有哪些特性呢?首先Linuxkit是基于Moby构建出来一个操作系统,它可以包含Moby的组件生态,它的系统服务都是以容器方式运行的。可以对比一下以前的传统容器系统架构,就是以前可能在CentOS或者Ubuntu运行起来Docker引擎,在Docker引擎上面来去运行起来自己的服务,在这些容器引擎之外其实是有很多的系统服务,可能根本就使用不到,而他们也带来了很多的风险和系统负载。所以对于现在容器时代的这种操作系统而言,可以去抽象成更精简的系统,就是只有LinuxKit内核和容器引擎,系统服务也可以通过像Docker的应用一样去运行在容器引擎上面提供给整个系统,所有的系统服务也是以容器的方式插拔和升级或替换的。
ec3bcc3c03d5d6b20e32e09905f9393010b54cee
安全性
这种方式带来哪些好处呢?首先是对操作系统安全性的一个提升,对于很多企业来说,他们都会去买RedHat的系统,因为RedHat系统有官方支持,有很多的安全特性。其实它那些特性对Linuxkit来说是从根本上去就解决了的问题,比如说因为服务都是一些容器,所以在自己的系统中可以只组装需要的一些服务,这些服务也是在容器的沙箱中去运行的,比如说有一个DHCP的服务,它运行的时候可以去指定有哪些权限,就算有一些漏洞,可能它根本就没有权限去对系统去做那些操作,所以也从根本上解决了安全问题。其次如果这个服务真的存在漏洞,而且它能调动网络影响整个操作系统,对它进行升级也很方便,因为它就是一个容器,也可以对它进行替换。最后它的安全性还体现在它是由社区共建的,所有的Linuxkit组件都是开源的,有什么问题都会及时地得到解决。
540e407a98ea28606e72bd2f2383aebb7a3bc9e6
精简系统
它带来的另一个好处是比较精简。可以看一下正常系统大小,Ubuntu是1.4G,CentOS是680M,Linuxkit的裸系统的大小只有34M,因为它只有Kernel和一个容器引擎,所以系统特别小。而且服务少带来的好处就是启动很快,基本上在2至3秒钟就可以启动起来,这样就可以用到IoT设备上,可以不依赖很多的系统服务,所以它可以很快启动,而且会消耗更少的资源。Linuxkit也可以用到云计算场景上,这主要是看中它的动态可扩展性,比如哪一天要抢红包了,突然来了很多流量,用Linuxkit系统2至3秒钟就可以扩容出来一个实例,就可以更好地去应对。
48be55d1c6afd82c46173b5f46d574703e3d9936
可移植性
Linuxkit系统可能运行在很多环境上面,比如桌面、服务器以及大型主机等,架构上面可以有英特尔或者ARM,还有就是可能在裸机上或者在云平台的虚拟机上去运行。因为Linuxkit可以使用同一份配置,通过Moby去构建不同的参数去打出来不同的镜像,比如打出来ISO镜像适配于物理机,打出VHD去适配于虚拟机。
8aeb9bb62fc1f97f517980c62c6ea5ca3fbe8354
三、利用Moby工具和Linuxkit定制容器系统
然后看一下实际的描述文件要怎样写。它里面包含几个组件,它的操作系统里面的内核是哪一个镜像,它下面的容器引擎是哪些,然后还有就是下面去描述系统所依赖的服务容器,比如说例子里面加了DHCP,让它可以动态去获取网络配置,然后通过Moby的工具就可以一键去构建出来,还可以构建出不同格式,比如ISO、云平台的RAW和VHD。
bb1d654e8046afba412c22769db7093fa4fa7826
下面就是一个通过Moby工具和Linuxkit定制容器操作系统例子。左边是一个操作系统描述,用了一个Redis数据库的服务,导出出来一个ISO格式,通过Moby命令直接去构建镜像,这个镜像的大小只有41M,和其他的操作系统不是一个数量级的。
feb1dc3d71a187fc5be6d0a48bc6f2fd6ecfb7a3

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

b4023c35d8f8a77540c155adad697c09210628cc

相关文章
|
5天前
|
Java Go 开发者
Docker容器技术简介及其与Go语言的结合点
【2月更文挑战第23天】本文首先概述了Docker容器技术的核心概念和优势,接着探讨了Go语言与Docker容器技术的结合点。通过阐述Docker的轻量级、可移植性和版本控制等特性,以及Go语言在容器化应用中的优势,本文旨在说明两者结合能够实现更高效、灵活的应用开发和部署。
|
5天前
|
Kubernetes 开发者 Docker
基于容器技术的微服务架构
基于容器技术的微服务架构
10 0
|
1月前
|
消息中间件 监控 NoSQL
容器化应用系统上生产的最佳实践
容器化应用系统上生产的最佳实践
|
7天前
|
Kubernetes 云计算 开发者
云计算中的容器化技术:Docker与Kubernetes的实践
云计算中的容器化技术:Docker与Kubernetes的实践
18 0
|
15天前
|
运维 API Docker
深入浅出:微服务架构与容器化技术的完美融合
【2月更文挑战第13天】 在现代软件开发领域,微服务架构和容器化技术已成为推动企业快速发展的两大核心力量。本文将从微服务的基本概念出发,深入探讨其与容器化技术结合的必然性与优势,进而分析如何在实践中有效地实现二者的完美融合。通过对微服务架构的细致解析及容器化技术的应用展示,旨在为读者提供一种全新的视角,理解并掌握这一前沿技术趋势,以指导实际工作中的技术选择与架构设计。
|
17天前
|
监控 数据可视化 Linux
如何使用可视化管理工具DockerUI远程管理docker容器
如何使用可视化管理工具DockerUI远程管理docker容器
|
19天前
|
Kubernetes 测试技术 Linux
【Docker管理工具】安装Docker容器自动更新工具Watchtower
【2月更文挑战第8天】安装Docker容器自动更新工具Watchtower
60 0
|
23天前
|
存储 监控 测试技术
【Docker管理工具】安装Oxker容器管理工具
【2月更文挑战第4天】安装Oxker容器管理工具
64 2
|
1月前
|
运维 Java Linux
深入解析:使用Docker容器化技术提升Java应用的部署效率
在快速迭代的软件开发周期中,如何保证应用的快速、一致和可靠部署成为了开发团队需要面对的重大挑战。本文将探讨如何利用Docker容器化技术,结合Java应用,实现高效、一致的部署流程。我们将从Docker的基本概念出发,详细介绍将Java应用容器化的步骤,包括创建Dockerfile、构建镜像以及运行容器等关键环节,并通过示例代码加以说明。此外,本文还将讨论在使用Docker部署Java应用时可能遇到的常见问题及其解决策略,旨在为读者提供一种提升部署效率、优化开发流程的有效方法。
293 2
|
1月前
|
虚拟化 开发者 Docker
深入浅出:利用Docker容器化技术加速Web开发流程
在本篇文章中,我们将探讨Docker容器化技术如何为Web开发带来革命性的效率提升。通过具体案例和实操示范,我们不仅会介绍Docker的基本概念和工作原理,还将深入分析如何利用Docker容器化技术简化开发环境的搭建、提高应用的可移植性以及加快部署速度。本文旨在为读者提供一种全新的视角,理解并实践如何通过Docker优化现代Web开发流程,无论是对于个人开发者还是团队项目,都将带来前所未有的便捷和效率。
16 0

相关产品

  • 容器镜像服务
  • 容器服务Kubernetes版