悶熱。無風。。。 css
很是久沒寫技術文章,因此今天分析一下docker相關的進程。html
容器相關的進程
安裝容器的時候。一句話就夠了,yum -y install docker-ce,前提是配置好docker的yum源,但是有的時候配置好了源,老是會發現timeout,呵呵噠。。docker
。嘗試下阿里雲的yum源。
api
安裝完畢docker以後,就會發現如上的文件。除去了相關的幫助文檔,在當中可以看到,分爲各類各樣的二進制程序,docker表示爲docker的client。一個命令行程序的使用。dockerd主要是服務端程序,在默認的狀況下。client發送的請求都是由dockerd接收。而dockerd則是一個restfull的api接口;docker-containerd可以看出來包含三部分。一部分是client名稱爲ctr,一個是containerd用來提供grpc的接口,主要用來進行容器的管理,鏡像的管理。存儲和網絡的管理。一個是containerd-shim,主要是用來執行容器的進程;而docker-runc則是容器的執行時。docker-proxy主要是來實現網絡轉發功能,docker-init看名字是初始化的意思,應該是初始化網絡,生成相關的文件。
緩存
在安裝完畢以後,啓動docker服務例如如下:restful
啓動完畢以後。就看到生成文件,執行時文件,並且生成了一個橋接的網絡接口。
網絡
容器的根文件夾主要用來存放一些鏡像,網絡配置狀況,編譯image的緩存。執行時環境,掛載的卷等元數據信息。
curl
在沒有啓動容器的時候。進程信息例如如下所看到的:工具
執行一個容器以後,進程信息例如如下所看到的:
post
進程與線程:
從進程的id可以看出來。dockerd生成了docker-containerd,docker-containerd生成了docker-containerd-shim。那麼docker-runc去哪裏了。
。
。
一、 docker-runc是容器的執行時,專門用來作容器的建立,啓動,中止,刪除操做,當每次執行完畢以後,就會退出。容器的執行時已經成爲標準,在docker-ce裏面使用的runc。而在原來的版本號中使用的lxc,其它的版本號還有rkt等。
二、 docker-containerd-shim主要是來負責容器的執行,並且用來向docker-containerd來彙報容器的狀態。從而容器的狀態數據不用存放在內存中。而每個容器都會使用一個docker-containerd-shim的進程來進行管理。
三、 docker-containerd主要是用來負責容器生命週期的管理,鏡像,存儲,網絡的管理。這個開放了一個grpc的接口。從而可以適配很是多平臺,上層可以直接調用。而dockerd則是一個詳細的實現,其它還有lxd等。
四、 dockerd主要是服務端程序,提供了restfull接口,可以使用curl直接訪問
支持遠程訪問的時候。需要改動啓動參數:
查看執行時環境:
爲何要使用docker-containerd-shim。主要是爲了防止dockerd和containerd掛掉,也是爲了熱遷移作準備,例如如下殺掉containerd以後,依然能訪問容器的服務:
沒法鏈接docker主機(也有多是docker服務未啓動):
閒扯
當分析完這個進程以後。陷入了深深的沉思。。
。分析這些進程有個毛的用。。。
查看服務是否啓動,假設dockerd進程被殺,會被systemd本身主動拉起
假設帶有有用性的目的去看這些進程。一點用處都沒有。假設從瞭解原理的方面,卻是略有所獲。從dockerd一個容器引擎分離出幾個進程,containerd,shim,runc。除了標準化以外,也從另一個方面說出了各個組件的專注職責原則。從而可以進行替換,並不怕一家公司進行壟斷,另外在進行分層的時候。也表現了上層僅僅是對下層的一層的封裝,並提供額外的功能,好比dockerd提供了從registry上傳和下載的做用,而containerd則是提供管理容器生命週期的功能,而runc則是從執行容器的工具。
從標準化的指定上來講。無論runc的標準話仍是image的標準化。總體的目標是弱依賴,僅僅要提供對應的接口就可以提供服務,僅僅要符合標準,那麼就是可以執行的。