載體為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中

獲得下載下傳鏡像的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}”)
注冊到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位字元組成