docker概念很乱?俺来替你理一下!
docker是什么?OCI又是什么?CRI又是什么?containerd又TM是什么?有沒有感覺概念非常的亂?
造成這一切亂象的根本,是各個利益公司之間的競爭造成的。商業競爭造成了用戶的困擾,尤其是每個公司都在推銷自己技術概念的時候。
接下來,俺將按照自己的理解方式,嘗試為你解讀這些操蛋的名詞,讓你對容器技術更多一些了解。如果你正在使用的是docker,你會發現這個可憐的,容器時代的引領者,正在慢慢丟掉自己的所有。
Docker并不是全部
自從docker加入了鏡像倉庫,引爆了容器技術,很多人認為docker就代表了容器的全部。這種觀點很普遍,主要是由于docker實在是太火了。即使k8s二次官宣拋棄docker,它的熱度依然不減。
其實,現階段,docker只是眾多容器技術中的其中一種。它有三個主要的概念。
-
鏡像??代表了最終的軟件包,不可變的軟件載體。相當于安裝文件
-
容器?鏡像的運行時,實際運行的實例,具有明確的進程號
-
倉庫?存放鏡像的倉庫,可以進行統一的版本管理和權限管理
docker是運行時和一堆開發工具集合的統稱。docker-cli就不必多說了,就是一堆命令行的集合,我們主要看一下運行時。
-
docker?我們平常操作docker,使用的就是docker命令,它就是我們所說的命令行接口,相當于一個客戶端。它將指令發送到dockerd
-
dockerd?docker的服務端。比如我們在Linux上安裝docker,就要啟動一個常駐進程,才能管理所有的docker進程
-
containerd?這個組件,是從Docker1.11版本才有的,是從dockerd里拆出來的,是容器標準化后的產物。它遵循的是OCI標準,這個標準后面我們還會用圖來說明它的位置。containerd功能齊全,換句話說,你的服務器上可以沒有dockerd,只需要containerd就能運行你的容器
-
runc?容器運行時組件,是一個標準的OCI容器實現運行時,可用來直接創建和運行容器。可以看到containerd和runc都是OCI的實現,區別是前者是管理工具,后者是運行容器
-
containerd-shim?墊片的意思,主要是將containerd與真正的容器進行解耦
-
ctr?也叫做containerd-ctr,是containerd的客戶端
你可能會特別奇怪,僅僅一個小小的docker,怎么就分了這么多層!按照常理,俺只需要一個client端,一個守護進程就夠了,怎么拆分了這么多層?
這是由于歷史發展原因引起的。為了解耦,為了實現OCI標準,docker的組件不得不拆了又拆,最后形成了一個松耦合的架構。后來,由于k8s加入競爭,又出現了一個新的名詞:CRI。接下來,我們綜合k8s,來看一下各個組件所存在的層次。
兩個標準割裂世界
為什么搞得這么復雜,主要是因為兩個標準的加入。CRI和OCI。下面這張買QQ平臺大圖,大體體現了它們之間的關系。
OCI全稱是Open Container Initiative,定義得是容器運行時得標準。這個標準,使用Linux的cgroup和namespace等技術,和docker所使用的技術沒什么兩樣。docker只不過是OCI的一個實現而已,就像gVisor(runsc)所實現的一樣。
CRI是全稱是Container Runtime Interface,是k8s定義的一套與容器運行時進行交互的接口。containerd就是docker為了適應這個標準而開發的CRI實現,但它已經是CNCF的了,不再屬于docker了。
當然,除了containerd其他廠商也可以基于CRI-O做一些事情,同樣實現了CRI接口。這樣就可以無縫接入到k8s中,比如redhat的OpenShift,就選用的CRI-O。但對于容器的真正調度,其實還是OCI負責的,CRI只是個中轉站而已。比如,Podman,原來就是CRI-O項目的一部分,現在它可以直接操作runc來啟動容器。
docker整個體系,被兩個標準攔腰斬了兩次,組件多也就不足為怪了。
在早些版本中,k8s為了支持docker,不得不包含一個叫做dockershim的組件。后來,k8s宣布不再支持docker,其實是放棄了dockershim組件,我們依然可以使用containerd來調用docker的所有功能。
”k8s不再支持docker“,這種文字游戲,讓很多人過早的放棄了docker。
總結
2020年12月8日,k8s再次發布了棄用docker的文章。
這種文字游戲,無疑再次給docker以暴擊。很多公司,其實運行的docker好好的,但主流調度系統這么一發聲,就必須研究一些雷同的技術,來應對可能會出現的技術變革。
早在2014年,docker的商業化態度還是非常強硬的,先后得罪了coreos,redhat等一系列組織,拒絕了google推出中立容器的合作。從關系親密到反目成仇,也是讓人無限感概。CNCF云原生基金的成立,已經宣告了docker商業化的失敗,docker甚至自己搞了個開源版本moby。丟了編排調度,理念被fork,這一切都讓docker慢慢的丟掉自己的話語權。
事實證明,docker的母公司,撐不起云原生這么大的蛋糕。大眾還是希望選擇一些巨人公司,然后匍匐在它的腳下。
這個選擇,就是CNCF,目前還是一個比較開放的組織。相比較而言,docker是一個商業化產品。受益于開源,podman定位于取代docker,它是redhat出品。
不開源讓你滅亡,是docker的最終結果。但開源呢?目前來看,開源界,絕大部分,不過是集體為google,亞馬遜,oracle等幾家巨頭打免費的工罷了。
總結
以上是生活随笔為你收集整理的docker概念很乱?俺来替你理一下!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 在Linux下写一个自己的命令
- 下一篇: 一文教你玩转链上「动森」My Neigh