美國時間12月14日,Docker公司宣布將containerd從Docker Engine中分離,并捐贈到一個新的開源社區獨立發展和運營,"一個工業標準的容器運行時,注重簡單、 健壯性、可移植性"。containerd可以作為daemon程序運行在Linux和Windows上,管理機器上所有容器的生命周期。阿里云,AWS, Google,IBM和Microsoft作為初始成員,會為項目提供貢獻和維護人員。
containerd對于很多人來還是很陌生,為什么Docker公司會大張旗鼓地宣布這個開源項目,并得到了業界巨大的反響。
實際上早在16年3月,Docker 1.11的Docker Engine里就包含了containerd,而現在則是把containerd從Docker Engine里徹底剝離出來,作為一個獨立的開源項目獨立發展,目標是提供一個更加開放、穩定的容器運行基礎設施。和原先包含在Docker Engine里containerd相比,獨立的containerd將具有更多的功能,可以涵蓋整個容器運行時管理的所有需求。
containerd并不是直接面向最終用戶的,而是主要用于集成到更上層的系統里,比如Swarm, Kubernetes, Mesos等容器編排系統。containerd以Daemon的形式運行在系統上,通過unix domain docket暴露很低層的gRPC API,上層系統可以通過這些API管理機器上的容器。每個containerd只負責一臺機器,Pull鏡像,對容器的操作(啟動、停止等),網絡,存儲都是由containerd完成。具體運行容器由runC負責,實際上只要是符合OCI規范的容器都可以支持。
這對于社區和整個Docker生態來說是一件好事。對于Docker社區的開發者來說,獨立的containerd更簡單清晰,基于containerd增加新特性也會比以前容易。
對于容器編排服務來說,運行時只需要使用containerd+runC,更加輕量,容易管理。而獨立之后containerd的特性演進可以和Docker Engine分開,專注容器運行時管理,可以更穩定。在向后兼容上也可以做的更好,containerd第一個正式版本1.0 Release之后將提供一年的支持,包括安全更新和Bugfix,而每次升級也會向后兼容一個小版本。
Docker為了表示對于社區和生態的誠意,特意強調了containerd中立的地位,符合各方利益。可以預見containerd將成為Docker平臺的一塊重要組件。阿里云, AWS, Google,IBM和Microsoft將參與到containerd的開發中。
為了讓大家更好的理解containerd的功能和架構,下面我們從更細節的角度看看containerd。
架構
這里是containerd的架構圖。中間這一層里包含了三個子系統,從這里可以看出containerd支持哪些能力
Distribution: 和Docker Registry打交道,拉取鏡像
Bundle: 管理本地磁盤上面鏡像的子系統。
Runtime:創建容器、管理容器的子系統。
可以看出containerd非常的干凈,提供的都是運行時真正需要的功能。
特性和路線圖
支持OCI鏡像
支持OCI運行時(runC)
支持鏡像的pull/push操作
容器運行時和生命周期管理
網絡原語:創建/修改/刪除接口
讓容器加入已有的Network Namespace
使用“內容可尋址”存儲支持全局鏡像多租戶共享
containerd當前版本是0.2.4,是從Docker Engine剝離的一個功能子集。當功能覆蓋前面的特性列表時,containerd版本更新到1.0,之后會保證API的穩定性,并提供1年的LTS.
containerd和Docker Engine之間的關系
Docker Engine包含containerd,containerd專注于運行時的容器管理,而Docker除了容器管理之外還可以完成鏡像構建之類的功能。
containerd提供的API偏底層,不是給普通用戶直接用的。對于普通用戶來說,可以繼續使用Docker。容器編排系統的開發者才需要containerd,比如阿里云容器服務團隊。
containerd,OCI和runC之間的關系
OCI是一個標準化的容器規范,包括運行時規范和鏡像規范。runC是基于這個規范的一個參考實現,Docker貢獻了runC的主要的代碼。
從技術棧上,containerd比runC的層次更高,containerd可以使用runC啟動容器,還可以下載鏡像,管理網絡。
containerd和容器編排系統的關系
從下圖可以看出containerd在容器技術生態中的位置。對開源編排系統,Kubernetes現在直接使用Docker,將來的版本可以轉而使用containerd。Mesos和其他的編排引擎也可以使用containerd而不是直接用Docker。
對云計算開發商,也可以非常方便地基于containerd提供定制化的容器網絡、容器存儲和編排方案。
總結
containerd目標是提供一個更加開放、穩定的容器運行基礎設施。一方面最終客戶將受益于一個穩定和良好支持的容器基礎設施。另一方面,各家廠商可以利用containerd作為一個標準化、靈活的容器操作層,可以非常方便地提供定制化的網絡、存儲和容器編排。這對構建一個開放和健康的容器生態具有重要意義。
阿里云作為成員之一會積極參與新的開源項目,把在容器方面的探索和積淀回饋到社區中,幫助國內客戶利用容器技術提升IT能力實現業務創新。