<b>摘要:</b>在雲栖techday34期:dockercon2017最新的技術解讀中,阿裡巴巴技術專家王炳燊為大家解讀了在dockercon2017中新釋出的moby項目和linuxkit項目,為大家詳細地介紹了moby與docker的差別,以及linuxkit的優勢所在,并通過示例介紹了如何利用moby工具和linuxkit定制容器系統。
<b>以下内容根據演講嘉賓現場視訊以及速記整理而成。</b>
<b>演講嘉賓介紹:</b>
王炳燊(花名:溪恒),具有豐富的linux開發經驗,對docker技術有深入研究,多次送出docker patch。之前從事阿裡雲容器服務網絡方案的設計與實作,專注于容器技術的基礎環境研究。
本次分享主要圍繞以下三個方面:
為什麼産生moby項目
linuxkit項目
利用moby工具和linuxkit定制容器系統

本次分享會對docker在dockercon裡面釋出的争議比較多的兩個新項目——moby和linuxkit做一些分析。大家都知道在dockercon上,docker公司把docker項目改名成了moby,并且釋出了linuxkit項目。是以在本次分享中,首先會介紹一下moby項目,然後再介紹一下linuxkit項目,最後再結合這兩個項目去建構自己的一個容器系統。
<b></b>
一、為什麼産生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項目,而是通過這些元件去拼裝出來一個容器引擎去滿足自己的需求。
<b>二、linuxkit項目</b>
接下來看一下最新釋出元件——linuxkit。linuxkit是很多公司一起聯合釋出的容器時代的一個安全、精簡、可移植的作業系統,那麼它有哪些特性呢?首先linuxkit是基于moby建構出來一個作業系統,它可以包含moby的元件生态,它的系統服務都是以容器方式運作的。可以對比一下以前的傳統容器系統架構,就是以前可能在centos或者ubuntu運作起來docker引擎,在docker引擎上面來去運作起來自己的服務,在這些容器引擎之外其實是有很多的系統服務,可能根本就使用不到,而他們也帶來了很多的風險和系統負載。是以對于現在容器時代的這種作業系統而言,可以去抽象成更精簡的系統,就是隻有linuxkit核心和容器引擎,系統服務也可以通過像docker的應用一樣去運作在容器引擎上面提供給整個系統,所有的系統服務也是以容器的方式插拔和更新或替換的。
<b>安全性</b>
這種方式帶來哪些好處呢?首先是對作業系統安全性的一個提升,對于很多企業來說,他們都會去買redhat的系統,因為redhat系統有官方支援,有很多的安全特性。其實它那些特性對linuxkit來說是從根本上去就解決了的問題,比如說因為服務都是一些容器,是以在自己的系統中可以隻組裝需要的一些服務,這些服務也是在容器的沙箱中去運作的,比如說有一個dhcp的服務,它運作的時候可以去指定有哪些權限,就算有一些漏洞,可能它根本就沒有權限去對系統去做那些操作,是以也從根本上解決了安全問題。其次如果這個服務真的存在漏洞,而且它能調動網絡影響整個作業系統,對它進行更新也很友善,因為它就是一個容器,也可以對它進行替換。最後它的安全性還展現在它是由社群共建的,所有的linuxkit元件都是開源的,有什麼問題都會及時地得到解決。
<b>精簡系統</b>
它帶來的另一個好處是比較精簡。可以看一下正常系統大小,ubuntu是1.4g,centos是680m,linuxkit的裸系統的大小隻有34m,因為它隻有kernel和一個容器引擎,是以系統特别小。而且服務少帶來的好處就是啟動很快,基本上在2至3秒鐘就可以啟動起來,這樣就可以用到iot裝置上,可以不依賴很多的系統服務,是以它可以很快啟動,而且會消耗更少的資源。linuxkit也可以用到雲計算場景上,這主要是看中它的動态可擴充性,比如哪一天要搶紅包了,突然來了很多流量,用linuxkit系統2至3秒鐘就可以擴容出來一個執行個體,就可以更好地去應對。
<b>可移植性</b>
linuxkit系統可能運作在很多環境上面,比如桌面、伺服器以及大型主機等,架構上面可以有英特爾或者arm,還有就是可能在裸機上或者在雲平台的虛拟機上去運作。因為linuxkit可以使用同一份配置,通過moby去建構不同的參數去打出來不同的鏡像,比如打出來iso鏡像适配于實體機,打出vhd去适配于虛拟機。
<b>三、利用moby工具和linuxkit定制容器系統</b>
然後看一下實際的描述檔案要怎樣寫。它裡面包含幾個元件,它的作業系統裡面的核心是哪一個鏡像,它下面的容器引擎是哪些,然後還有就是下面去描述系統所依賴的服務容器,比如說例子裡面加了dhcp,讓它可以動态去擷取網絡配置,然後通過moby的工具就可以一鍵去建構出來,還可以建構出不同格式,比如iso、雲平台的raw和vhd。
下面就是一個通過moby工具和linuxkit定制容器作業系統例子。左邊是一個作業系統描述,用了一個redis資料庫的服務,導出出來一個iso格式,通過moby指令直接去建構鏡像,這個鏡像的大小隻有41m,和其他的作業系統不是一個數量級的。
然後去直接配置它的啟動,可以看到它在三秒鐘之内就能夠啟動完成。