Docker C/S模式總體技術架構深刻剖析-Docker商業環境實戰

專一於大數據及容器雲核心技術解密,可提供全棧的大數據+雲原平生臺諮詢方案,請持續關注本套博客。若有任何學術交流,可隨時聯繫。更多內容請關注《數據雲技術社區》公衆號。 docker

1 Docker整體技術架構

  • Docker Daemon做爲Docker架構中的主體部分,首先提供Server的功能使其能夠接受Docker Client的請求;然後Engine執行Docker內部的一系列工做,每一項工做都是以一個Job的形式的存在。
  • Job的運行過程當中,當須要容器鏡像時,則從Docker Registry中下載鏡像,並經過鏡像管理驅動graphdriver將下載鏡像以Graph的形式存儲;
  • 當須要爲Docker建立網絡環境時,經過網絡管理驅動networkdriver建立並配置Docker容器網絡環境;
  • 當須要限制Docker容器運行資源或執行用戶指令等操做時,則經過execdriver來完成。

2 Docker Client 架構

  • Docker Client是Docker架構中用戶用來和Docker Daemon創建通訊的客戶端。用戶使用的可執行文件爲docker,經過docker命令行工具能夠發起衆多管理container的請求。
  • Docker Client能夠經過如下三種方式和Docker Daemon創建通訊:tcp://host:port,unix://path_to_socket和fd://socketfd。
  • Docker Client發送容器管理請求後,由Docker Daemon接受並處理請求,當Docker Client接收到返回的請求相應並簡單處理後,Docker Client一次完整的生命週期就結束了。當須要繼續發送容器管理請求時,用戶必須再次經過docker可執行文件建立Docker Client。

2 Docker Daemon 架構

  • Docker Daemon是Docker架構中一個常駐在後臺的系統進程。
  • 接受並處理Docker Client發送的請求。該守護進程在後臺啓動了一個Server,Server負責接受Docker Client發送的請求;接受請求後,Server經過路由與分發調度,找到相應的Handler來執行請求。
  • Docker Daemon的架構,大體能夠分爲如下三部分:Docker Server、Engine和Job。

2.1 Docker Server

  • Docker Server在Docker架構中是專門服務於Docker Client的server。該server的功能是:接受並調度分發Docker Client發送的請求。
  • 在Docker的啓動過程當中,經過包gorilla/mux,建立了一個mux.Router,提供請求的路由功能。在Golang中,gorilla/mux是一個強大的URL路由器以及調度分發器。該mux.Router中添加了衆多的路由項,每個路由項由HTTP請求方法(PUT、POST、GET或DELETE)、URL、Handler三部分組成。
  • 若Docker Client經過HTTP的形式訪問Docker Daemon,建立完mux.Router以後,Docker將Server的監聽地址以及mux.Router做爲參數,建立一個httpSrv=http.Server{},最終執行httpSrv.Serve()爲請求服務。
  • 在Server的服務過程當中,Server在listener上接受Docker Client的訪問請求,並建立一個全新的goroutine來服務該請求。在goroutine中,首先讀取請求內容,而後作解析工做,接着找到相應的路由項,隨後調用相應的Handler來處理該請求,最後Handler處理完請求以後回覆該請求。

2.2 Docker Engine

  • Engine是Docker架構中的運行引擎,同時也Docker運行的核心模塊。它扮演Docker container存儲倉庫的角色,而且經過執行job的方式來操縱管理這些容器。
  • 在Engine數據結構的設計與實現過程當中,有一個handler對象。該handler對象存儲的都是關於衆多特定job的handler處理訪問。舉例說明,Engine的handler對象中有一項爲:{「create」: daemon.ContainerCreate,},則說明當名爲」create」的job在運行時,執行的是daemon.ContainerCreate的handler。

2.3 Docker Job

  • 一個Job能夠認爲是Docker架構中Engine內部最基本的工做執行單元。Docker能夠作的每一項工做,均可以抽象爲一個job。例如:在容器內部運行一個進程,這是一個job;建立一個新的容器,這是一個job,從Internet上下載一個文檔,這是一個job;包括以前在Docker Server部分說過的,建立Server服務於HTTP的API,這也是一個job,等等。

3 Docker Driver架構

  • Driver是Docker架構中的驅動模塊。經過Driver驅動,Docker能夠實現對Docker容器執行環境的定製。因爲Docker運行的生命週期中,並不是用戶全部的操做都是針對Docker容器的管理,另外還有關於Docker運行信息的獲取,Graph的存儲與記錄等。所以,爲了將Docker容器的管理從Docker Daemon內部業務邏輯中區分開來,設計了Driver層驅動來接管全部這部分請求。
  • 在Docker Driver的實現中,能夠分爲如下三類驅動:graphdriver、networkdriver和execdriver。

3.1 graphdriver驅動

  • graphdriver主要用於完成容器鏡像的管理,包括存儲與獲取。即當用戶須要下載指定的容器鏡像時,graphdriver將容器鏡像存儲在本地的指定目錄;同時當用戶須要使用指定的容器鏡像來建立容器的rootfs時,graphdriver從本地鏡像存儲目錄中獲取指定的容器鏡像。

3.2 networkdriver驅動

  • 完成Docker容器網絡環境的配置,其中包括Docker啓動時爲Docker環境建立網橋;Docker容器建立時爲其建立專屬虛擬網卡設備;以及爲Docker容器分配IP、端口並與宿主機作端口映射,設置容器防火牆策略等。

3.2 execdriver驅動

  • execdriver做爲Docker容器的執行驅動,負責建立容器運行命名空間,負責容器資源使用的統計與限制,負責容器內部進程的真正運行等。
  • 在execdriver的實現過程當中,原先可使用LXC驅動調用LXC的接口,來操縱容器的配置以及生命週期,而如今execdriver默認使用native驅動,不依賴於LXC。具體體如今Daemon啓動過程當中加載的ExecDriverflag參數,該參數在配置文件已經被設爲」native」

4 libcontainer架構

  • libcontainer是Docker架構中一個使用Go語言設計實現的庫,設計初衷是但願該庫能夠不依靠任何依賴,直接訪問內核中與容器相關的API。
  • 正是因爲libcontainer的存在,Docker能夠直接調用libcontainer,而最終操縱容器的namespace、cgroups、apparmor、網絡設備以及防火牆規則等。這一系列操做的完成都不須要依賴LXC或者其餘包。libcontainer架構以下圖:

5 Docker container交付

  • 用戶經過指定容器鏡像,使得Docker容器能夠自定義rootfs等文件系統; 用戶經過指定計算資源的配額,使得Docker容器使用指定的計算資源; 用戶經過配置網絡及其安全策略,使得Docker容器擁有獨立且安全的網絡環境; 用戶經過指定運行的命令,使得Docker容器執行指定的工做。

6 總結

本文參考<<Docker源碼分析>>,感謝做者,本文執筆小記,方便查閱,謝謝!安全

專一於大數據及容器雲核心技術解密,可提供全棧的大數據+雲原平生臺諮詢方案,請持續關注本套博客。若有任何學術交流,可隨時聯繫。更多內容請關注《數據雲技術社區》公衆號。 網絡

相關文章
相關標籤/搜索