天天看點

docker學習 - docker啟動和鏡像docker daemon啟動鏡像下載下傳鏡像存儲

載體為daemon,排程管理engine,任務執行靠job

engine是map[string]handler,type handler func(*job) status

daemon的啟動流程:

注冊serve job、pull job、create job、start job等

建構serveapi job,并執行serveapi handler,建立支援多種協定請求(tcp/socker fd/預設unix socket)的http server,支援tls,包含http路由規則”post”:{“/images/create”: postimagescreate}

初始化graphdriver、graphdb、 graph.tagstore、 execdriver、volumedriver、daemon網絡環境

建構init_networkdriver job,建立docker0網橋,配置iptables對容器發出的資料包做snat位址轉換,是否開啟容器間的通信

docker pull ubuntu:14.04

docker client流程

解析指令行擷取鏡像名和register位址,反射機制調用dockercli.cmdpull,從dockercfg中讀出使用者認證資訊,建構restful請求/images/create

docker server流程

http路由規則對應執行postimagescreate,從url中解析出鏡像名、register位址和使用者認證資訊,執行pull job與registry建立session

session包含認證資訊和主機環境資訊的http請求的工廠模式,需要和register發起多次請求

和docker register的通信

請求擷取指定鏡像名的image所有tag資訊,存到repositorydata中

docker學習 - docker啟動和鏡像docker daemon啟動鏡像下載下傳鏡像存儲

獲得下載下傳鏡像的image_id後,通過tagstore.pullingpool檢查是否該鏡像正在下載下傳,map[string]chan struct{}

請求擷取指定image_id的所有parent的image_id

對每個待下載下傳的image_id,通過graph.idindex檢查是否在本地的鏡像倉庫graph中

請求擷取該image_id的image json和大小資訊,建構image對象

請求擷取該image_id的内容

在graph檔案系統aufs/overlayfs存儲image

配置tagstore

将下載下傳的所有image_id都寫入tagstore.repositories中

tagstore持久化到path.join(config.root, “repositories-{graphfs}”)

docker學習 - docker啟動和鏡像docker daemon啟動鏡像下載下傳鏡像存儲

注冊到graph中(aufs)

aufs在layers/diff/mnt中建立image_id目錄layers保留每個鏡像的所有祖先鏡像清單diff存儲每個鏡像layer的内容mnt該層鏡像上挂載的可讀寫layer

union mount先以隻讀方式mount該鏡像的所有祖先鏡像的diff目錄到該鏡像的mnt目錄,再以讀寫方式mount該鏡像的diff目錄到其mnt目錄

将壓縮的鏡像内容(http body)解壓到layer目錄,通過檔案流開頭的10位元組來判斷檔案類型,檔案流封裝在processreader帶進度條的檔案流

path.join(graph.root, image_id)中保留image json和檔案大小的layersize檔案

注冊鏡像id,idindex是基數樹/字首樹image_id由64位字元組成