【原創】docker原始碼分析(1)---框架與engine
原始碼為docker 1.6.2版本
為啥要用1.6.2版本,這是因為我買了一本書《Docker容器與容器雲》,這本書裡面也是用的1.6.2版本。
一邊可以學習這本書,一邊研究原始碼,事半功倍。除了這本書,現在網上也有很多講解docker分析的。為了和其他的不同,我們這裡主要是針對原始碼進行分析。
那麼首先大致介紹下框架
1、框架
現在在網上已經有很多這樣的框架介紹。如果沒有看過的,我推薦 這裡有完整的框架介紹。下面的圖片就轉自於此
這個框架圖,已經完整的體現出了整個docker的流程。其中engine是整個框架中的一個膠水模組,起著粘連其他所有模組的重要部分。下面我們就先對engine原始碼做詳細分析
2、engine
廢話不多說,直接看原始碼
原始碼在docker\engine\engine.go
2.1、結構體
Engine功能很簡單,主要有幾個功能
1、handler管理功能。其他所有模組都會將其帶有的功能,以handler的方式註冊到Engine中。涉及的變數有handlers,是一個map
2、job管理功能,這裡有sync.WaitGroup,用於記錄當前工作的job
那麼看看Engine都提供了哪些介面
2.2、 註冊介面
兩個handler註冊介面
Register用於其他模組註冊其提供的工作handler。很簡單就是一個map,用於儲存對應的handler
RegisterCatchall 用於註冊非法job,獲取的handler
handler介面為一個函式物件
另外還有一個全域性的handler
也是一個全域性的handler map,用於在初始化Engine之前註冊
2.3、初始化
初始化很簡單,主要工作就是註冊了一個commands的handler,另外將全域性的handlers拷貝到自己的handlers中
我們看看commands提供的具體handler
這裡就是將handlers中所有提供的操作,收集起來,方便提供查詢
2.4、Create job
建立job。從原始碼來看,初始化了job的結構體。 然後最主要的是handler的初始化,這裡從Engine中已經註冊的handlers中,根據name,來查詢相對於的handler。如果沒有查詢到,就屬於非法的,就賦值為catchall
2.5、shutdown
在系統結束的時候,會呼叫Engine的shutdown。
在shutdown之前,也可以註冊callback,用於在shutdown的時候進行處理
將h新增到onShutdown切片中,並用shutdownWait記錄數量
shutdown函式提供幾個功能
1、拒絕新的job
2、等待所有active jobs工作完成(這裡的job指的是沒有超時的job)
3、呼叫onShutdown註冊的所有回撥函式
4、當所有的jobs完成時,或者超時15秒的時候,return
首先將shutdown,標誌位設定為true
接著等待jobs完成工作,或等待5秒超時
啟動所有的Shutdown回撥,並等待回撥結束,或者是超時10秒,然後退出。
2.6、小結
Engine功能簡單,程式碼也很簡單,就是一個job的管理器,以及handler的管理器
3、job
job是整個docker原始碼中的基本工作單位,下面我們看看job是怎麼 的
3.1、結構體
結構體中,最重要的東西有
handler,這個就是job重點,是在Engine Create job的時候,獲取到的
name,是job的工作command
env,這個是一個環境變數
整體來講,job就是一個對任務的包裝,它將任務的所需要的所有東西都準備好
3.2 Run
前面我們將job所需要的所有前期東西都準備好,那麼現在就要開始工作了
這裡有一個特殊的job serveapi,它將不記錄在eng的task中,其餘所有的job都將記錄在eng的task中,這個主要用於eng在Shutdown的時候,用於等待job完成工作
真正的工作,是在這裡,在handler中。
最後,就是將io關閉。
3.3、小結
job的原始碼更簡單,就是一個簡單的前期的準備,然後工作的時候,呼叫了相對應的handler
龔浩華
QQ 月牙寂 道長 29185807
2016年4月28日