docker進程分析

版權聲明:本文爲博主原創文章,未經博主贊成不得轉載。 https://blog.csdn.net/TM6zNf87MDG7Bo/article/details/80970541
序言

     悶熱。無風。。。   css

 

    很是久沒寫技術文章,因此今天分析一下docker相關的進程。html

容器相關的進程

    安裝容器的時候。一句話就夠了,yum -y install docker-ce,前提是配置好docker的yum源,但是有的時候配置好了源,老是會發現timeout,呵呵噠。。docker

。嘗試下阿里雲的yum源。
api

640?wx_fmt=png

    安裝完畢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

640?</p><p>wx_fmt=png

    啓動完畢以後。就看到生成文件,執行時文件,並且生成了一個橋接的網絡接口。
網絡

640?wx_fmt=png

    容器的根文件夾主要用來存放一些鏡像,網絡配置狀況,編譯image的緩存。執行時環境,掛載的卷等元數據信息。
curl

    在沒有啓動容器的時候。進程信息例如如下所看到的:工具

640?wx_fmt=png

    執行一個容器以後,進程信息例如如下所看到的:
post

640?</p><p>wx_fmt=png

    進程與線程:

640?</p><p>wx_fmt=png

    從進程的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直接訪問

640?wx_fmt=png

    支持遠程訪問的時候。需要改動啓動參數:

640?</p><p>wx_fmt=png

    查看執行時環境:

640?wx_fmt=png

    爲何要使用docker-containerd-shim。主要是爲了防止dockerd和containerd掛掉,也是爲了熱遷移作準備,例如如下殺掉containerd以後,依然能訪問容器的服務:

640?wx_fmt=png

    沒法鏈接docker主機(也有多是docker服務未啓動):

640?</p><p>wx_fmt=png

        

閒扯    

    當分析完這個進程以後。陷入了深深的沉思。。

。分析這些進程有個毛的用。。。

640?</p><p>wx_fmt=png

    查看服務是否啓動,假設dockerd進程被殺,會被systemd本身主動拉起

640?</p><p>wx_fmt=png

   

    假設帶有有用性的目的去看這些進程。一點用處都沒有。假設從瞭解原理的方面,卻是略有所獲。從dockerd一個容器引擎分離出幾個進程,containerd,shim,runc。除了標準化以外,也從另一個方面說出了各個組件的專注職責原則。從而可以進行替換,並不怕一家公司進行壟斷,另外在進行分層的時候。也表現了上層僅僅是對下層的一層的封裝,並提供額外的功能,好比dockerd提供了從registry上傳和下載的做用,而containerd則是提供管理容器生命週期的功能,而runc則是從執行容器的工具。


    從標準化的指定上來講。無論runc的標準話仍是image的標準化。總體的目標是弱依賴,僅僅要提供對應的接口就可以提供服務,僅僅要符合標準,那麼就是可以執行的。

相關文章
相關標籤/搜索