1. 程式人生 > >【原創】docker原始碼分析(1)---框架與engine

【原創】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日