閱讀37 返回首頁    go 阿裏雲 go 技術社區[雲棲]


【DockerCon2017最新技術解讀】使用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

最後更新:2017-05-29 13:02:25

  上一篇:go  來看動漫吧,一份專為IT宅準備的番組
  下一篇:go  Docker最新特性介紹