docker、oci、runc以及kubernetes梳理

容器無疑是近年來雲計算中最火熱的關鍵詞。隨着docker的大熱,docker、oci、runc、containerd等等名詞也逐漸傳播開來。這麼多的名詞,也容易讓人混淆。本文對相關名詞和其之間的聯繫進行一下梳理和總結,方便你們更好地理解。html

container

首先說的是container容器。隨着docker的大熱,docker的經典圖標,一條鯨魚拖着若干個集裝箱的經典形象已經深刻人心。docker中container的翻譯是譯爲容器仍是集裝箱,中文社區作過一次小小的討論。討論參見http://dockone.io/question/408。在此次討論中,筆者的意見是container並非docker出現了纔有的,而在以前,linux container就已經翻譯爲linux容器並被你們接受。而從含義來看,一開始選定把「容器」做爲container的翻譯,也應該是準確的。而隨着docker出現,container的概念深刻人心,而其與原來的linux container中的container,含義應該說是一致的。因此沿用容器的翻譯,筆者認爲是比較合適的。linux

那麼何爲容器。容器本質上是受到資源限制,彼此間相互隔離的若干個linux進程的集合。這是有別於基於模擬的虛擬機的。對於容器和虛擬機的區別的理解,你們能夠參考《京東基礎架構建設之路》中的闡釋,這裏再也不贅述。通常來講,容器技術主要指代用於資源限制的cgroup,用於隔離的namespace,以及基礎的linux kernel等。git

OCI

Open Container Initiative,也就是常說的OCI,是由多家公司共同成立的項目,並由linux基金會進行管理,致力於container runtime的標準的制定和runc的開發等工做。github

所謂container runtime,主要負責的是容器的生命週期的管理。oci的runtime spec標準中對於容器的狀態描述,以及對於容器的建立、刪除、查看等操做進行了定義。docker

runc,是對於OCI標準的一個參考實現,是一個能夠用於建立和運行容器的CLI(command-line interface)工具。runc直接與容器所依賴的cgroup/linux kernel等進行交互,負責爲容器配置cgroup/namespace等啓動容器所需的環境,建立啓動容器的相關進程。api

爲了兼容oci標準,docker也作了架構調整。將容器運行時相關的程序從docker daemon剝離出來,造成了containerd。Containerd向docker提供運行容器的API,兩者經過grpc進行交互。containerd最後會經過runc來實際運行容器。網絡

containerd

容器引擎

容器引擎,或者說容器平臺,不只包含對於容器的生命週期的管理,還包括了對於容器生態的管理,好比對於鏡像等。如今的docker、rkt以及阿里推出的pouch都可屬於此範疇。架構

docker,筆者認爲能夠分爲兩個階段來理解。在筆者接觸docker之初,docker版本爲1.2,當時的docker的主要做用是容器的生命週期管理和鏡像管理,當時的docker在功能上更趨近於如今的container runtime。然後來,隨着docker的發展,docker就再也不侷限於容器的管理,還囊括了存儲(volume)、網絡(net)等的管理,所以後來的docker更多的是一個容器及容器生態的管理平臺。工具

kubernetes與容器

kubernetes在初期版本里,就對多個容器引擎作了兼容,所以可使用docker、rkt對容器進行管理。以docker爲例,kubelet中會啓動一個docker manager,經過直接調用docker的api進行容器的建立等操做。雲計算

在k8s 1.5版本以後,kubernetes推出了本身的運行時接口api--CRI(container runtime interface)。cri接口的推出,隔離了各個容器引擎之間的差別,而經過統一的接口與各個容器引擎之間進行互動。

與oci不一樣,cri與kubernetes的概念更加貼合,並緊密綁定。cri不只定義了容器的生命週期的管理,還引入了k8s中pod的概念,並定義了管理pod的生命週期。在kubernetes中,pod是由一組進行了資源限制的,在隔離環境中的容器組成。而這個隔離環境,稱之爲PodSandbox。在cri開始之初,主要是支持docker和rkt兩種。其中kubelet是經過cri接口,調用docker-shim,並進一步調用docker api實現的。

如上文所述,docker獨立出來了containerd。kubernetes也順應潮流,孵化了cri-containerd項目,用以將containerd接入到cri的標準中。

cri-containerd

爲了進一步與oci進行兼容,kubernetes還孵化了cri-o,成爲了架設在cri和oci之間的一座橋樑。經過這種方式,能夠方便更多符合oci標準的容器運行時,接入kubernetes進行集成使用。能夠預見到,經過cri-o,kubernetes在使用的兼容性和普遍性上將會獲得進一步增強。

kubelet

參考資料

相關文章
相關標籤/搜索