1. 程式人生 > >docker程序分析

docker程序分析

序言

     悶熱。無風。。。   

 

    非常久沒寫技術文章,所以今天分析一下docker相關的程序。

容器相關的程序

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

。嘗試下阿里雲的yum源。

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服務例如以下:

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

    啟動完畢之後。就看到生成檔案,執行時檔案,而且生成了一個橋接的網路介面。

640?wx_fmt=png

    容器的根資料夾主要用來存放一些映象,網路配置情況,編譯image的快取。執行時環境,掛載的卷等元資料資訊。

    在沒有啟動容器的時候。程序資訊例如以下所看到的:

640?wx_fmt=png

    執行一個容器之後,程序資訊例如以下所看到的:

640?</p><div class=

wx_fmt=png" referrerPolicy="no-referrer">

    程序與執行緒:

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

    從程序的id能夠看出來。dockerd生成了docker-containerd,docker-containerd生成了docker-containerd-shim。那麼docker-runc去哪裡了。


    1、 docker-runc是容器的執行時,專門用來做容器的建立,啟動,停止,刪除操作,當每次執行完畢之後,就會退出。容器的執行時已經成為標準,在docker-ce裡面使用的runc。而在原來的版本號中使用的lxc,其它的版本號還有rkt等。

    2、 docker-containerd-shim主要是來負責容器的執行,而且用來向docker-containerd來彙報容器的狀態。從而容器的狀態資料不用存放在記憶體中。而每一個容器都會使用一個docker-containerd-shim的程序來進行管理。


    3、 docker-containerd主要是用來負責容器生命週期的管理,映象,儲存,網路的管理。這個開放了一個grpc的介面。從而能夠適配非常多平臺,上層能夠直接呼叫。而dockerd則是一個詳細的實現,其它還有lxd等。


    4、 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的標準化。整體的目標是弱依賴,僅僅要提供對應的介面就能夠提供服務,僅僅要符合標準,那麼就是能夠執行的。