1. 程式人生 > >Docker原始碼分析(一)之整體架構圖

Docker原始碼分析(一)之整體架構圖

一、Docker的總架構圖 


docker是一個C/S模式的架構,後端是一個鬆耦合架構,模組各司其職。

  1. 使用者是使用Docker Client與Docker Daemon建立通訊,併發送請求給後者。
  2. Docker Daemon作為Docker架構中的主體部分,首先提供Server的功能使其可以接受Docker Client的請求;
  3. Engine執行Docker內部的一系列工作,每一項工作都是以一個Job的形式的存在。
  4. Job的執行過程中,當需要容器映象時,則從Docker Registry中下載映象,並通過映象管理驅動graphdriver將下載映象以Graph的形式儲存;
  5. 當需要為Docker建立網路環境時,通過網路管理驅動networkdriver建立並配置Docker容器網路環境;
  6. 當需要限制Docker容器執行資源或執行使用者指令等操作時,則通過execdriver來完成。
  7. libcontainer是一項獨立的容器管理包,networkdriver以及execdriver都是通過libcontainer來實現具體對容器進行的操作。

二、Docker各模組元件分析

(一)Docker Client【發起請求】

  1. Docker Client是和Docker Daemon建立通訊的客戶端。使用者使用的可執行檔案為docker(類似可執行指令碼的命令),docker命令後接引數的形式來實現一個完整的請求命令(例如docker images,docker為命令不可變,images為引數可變)。

  2. Docker Client傳送容器管理請求後,由Docker Daemon接受並處理請求,當Docker Client接收到返回的請求相應並簡單處理後,Docker Client一次完整的生命週期就結束了。[一次完整的請求:傳送請求→處理請求→返回結果],與傳統的C/S架構請求流程並無不同。

(二)Docker Daemon【後臺守護程序】

  • Docker Daemon的架構圖

  1. Docker Server【排程分發請求】

    • Docker Server的架構圖

    1. Docker Server相當於C/S架構的服務端。功能為接受並排程分發Docker Client傳送的請求。接受請求後,Server通過路由與分發排程,找到相應的Handler來執行請求。

    2. 在Docker的啟動過程中,通過包gorilla/mux,建立了一個mux.Router,提供請求的路由功能。在Golang中,gorilla/mux是一個強大的URL路由器以及排程分發器。該mux.Router中添加了眾多的路由項,每一個路由項由HTTP請求方法(PUT、POST、GET或DELETE)、URL、Handler三部分組成。

    3. 建立完mux.Router之後,Docker將Server的監聽地址以及mux.Router作為引數,建立一個httpSrv=http.Server{},最終執行httpSrv.Serve()為請求服務。

    4. 在Server的服務過程中,Server在listener上接受Docker Client的訪問請求,並建立一個全新的goroutine來服務該請求。在goroutine中,首先讀取請求內容,然後做解析工作,接著找到相應的路由項,隨後呼叫相應的Handler來處理該請求,最後Handler處理完請求之後回覆該請求。

  2. Engine

    1. Engine是Docker架構中的執行引擎,同時也Docker執行的核心模組。它扮演Docker container儲存倉庫的角色,並且通過執行job的方式來操縱管理這些容器。

    2. 在Engine資料結構的設計與實現過程中,有一個handler物件。該handler物件儲存的都是關於眾多特定job的handler處理訪問。舉例說明,Engine的handler物件中有一項為:{"create": daemon.ContainerCreate,},則說明當名為"create"的job在執行時,執行的是daemon.ContainerCreate的handler。

  3. job

    1. 一個Job可以認為是Docker架構中Engine內部最基本的工作執行單元。Docker可以做的每一項工作,都可以抽象為一個job。例如:在容器內部執行一個程序,這是一個job;建立一個新的容器,這是一個job。Docker Server的執行過程也是一個job,名為serveapi。

    2. Job的設計者,把Job設計得與Unix程序相仿。比如說:Job有一個名稱,有引數,有環境變數,有標準的輸入輸出,有錯誤處理,有返回狀態等。

(三)Docker Registry【映象註冊中心】

  1. Docker Registry是一個儲存容器映象的倉庫(註冊中心),可理解為雲端映象倉庫,按repository來分類,docker pull 按照[repository]:[tag]來精確定義一個image。

  2. 在Docker的執行過程中,Docker Daemon會與Docker Registry通訊,並實現搜尋映象、下載映象、上傳映象三個功能,這三個功能對應的job名稱分別為"search","pull" 與 "push"。

  3. 可分為公有倉庫(docker hub)和私有倉庫。

(四)Graph【docker內部資料庫】

  • Graph的架構圖

  1. Repository

    1. 已下載映象的保管者(包括下載映象和dockerfile構建的映象)。

    2. 一個repository表示某類映象的倉庫(例如Ubuntu),同一個repository內的映象用tag來區分(表示同一類映象的不同標籤或版本)。一個registry包含多個repository,一個repository包含同類型的多個image。

    3. 映象的儲存型別有aufs,devicemapper,Btrfs,Vfs等。其中centos系統使用devicemapper的儲存型別。

    4. 同時在Graph的本地目錄中,關於每一個的容器映象,具體儲存的資訊有:該容器映象的元資料,容器映象的大小資訊,以及該容器映象所代表的具體rootfs。

  2. GraphDB

    1. 已下載容器映象之間關係的記錄者。

    2. GraphDB是一個構建在SQLite之上的小型圖資料庫,實現了節點的命名以及節點之間關聯關係的記錄

(五)Driver【執行部分】

Driver是Docker架構中的驅動模組。通過Driver驅動,Docker可以實現對Docker容器執行環境的定製。即Graph負責映象的儲存,Driver負責容器的執行。

  1. graphdriver

    • graphdriver架構圖

       

    1. graphdriver主要用於完成容器映象的管理,包括儲存與獲取。

    2. 儲存:docker pull下載的映象由graphdriver儲存到本地的指定目錄(Graph中)。

    3. 獲取:docker run(create)用映象來建立容器的時候由graphdriver到本地Graph中獲取映象。

  1. networkdriver

    • networkdriver的架構圖

       

    1. networkdriver的用途是完成Docker容器網路環境的配置,其中包括

      • Docker啟動時為Docker環境建立網橋;

      • Docker容器建立時為其建立專屬虛擬網絡卡裝置;

      • Docker容器分配IP、埠並與宿主機做埠對映,設定容器防火牆策略等。

  2. execdriver

    • execdriver的架構圖

       

    1. execdriver作為Docker容器的執行驅動,負責建立容器執行名稱空間,負責容器資源使用的統計與限制,負責容器內部程序的真正執行等。

    2. 現在execdriver預設使用native驅動,不依賴於LXC。

(六)libcontainer【函式庫】

  • libcontainer的架構圖

     

  1. libcontainer是Docker架構中一個使用Go語言設計實現的庫,設計初衷是希望該庫可以不依靠任何依賴,直接訪問核心中與容器相關的API。

  2. Docker可以直接呼叫libcontainer,而最終操縱容器的namespace、cgroups、apparmor、網路裝置以及防火牆規則等。

  3. libcontainer提供了一整套標準的介面來滿足上層對容器管理的需求。或者說,libcontainer遮蔽了Docker上層對容器的直接管理。

(七)docker container【服務交付的最終形式】

  • container架構

  1. Docker container(Docker容器)是Docker架構中服務交付的最終體現形式。

  2. Docker按照使用者的需求與指令,訂製相應的Docker容器:

    • 使用者通過指定容器映象,使得Docker容器可以自定義rootfs等檔案系統;

    • 使用者通過指定計算資源的配額,使得Docker容器使用指定的計算資源;

    • 使用者通過配置網路及其安全策略,使得Docker容器擁有獨立且安全的網路環境;

    • 使用者通過指定執行的命令,使得Docker容器執行指定的工作。

文章參考:

《Docker原始碼分析》

相關推薦

Docker原始碼分析整體構圖

一、Docker的總架構圖  docker是一個C/S模式的架構,後端是一個鬆耦合架構,模組各司其職。 使用者是使用Docker Client與Docker Daemon建立通訊,併發送請求給後者

Docker原始碼分析Docker Client

一、建立Docker Client     Docker是一個client/server的架構,通過二進位制檔案docker建立Docker客戶端將請求型別與引數傳送給Docker Server,Docker Server具體執行命令呼叫。 Docker Client執行流

Docker原始碼分析Docker架構

1 背景 1.1 Docker簡介 Docker是Docker公司開源的一個基於輕量級虛擬化技術的容器引擎專案,整個專案基於Go語言開發,並遵從Apache 2.0協議。目前,Docker可以在容器內部快速自動化部署應用,並可以通過核心虛擬化技術(namespaces及c

Glide原始碼分析從用法來看with方法

繼續啃原始碼,用過Glide的人,肯定都覺得它好好用,我們一般只需要幾行程式碼,就可以達到我們想要的效果,可以在這個背後是什麼呢?就需要我們來看了。 我一般看原始碼,我喜歡先從用法來看,然後一步一步的再細扣,所以就先從用法來看Glide的整體流程。 用過Glide的人,用下面這段

zigbee ZStack-2.5.1a原始碼分析

先看main, 在檔案Zmain.c裡面 main osal_init_system(); osalInitTasks(); ... ... SampleApp_Init( taskID ); // 使用者定義的任務

Docker Client原始碼分析

主要內容: Docker Client在Docker中的定位,以及Docker Client原始碼的初步分析。 本文選取Docker拆分為DockerCE(社群版)和DockerEE(企業版)之後的Docker-CE的第一個穩定版本v17.06.0-ce。 https://github.com/docker

Go學習go-ethereum【以太坊】原始碼分析

關於Go語言環境的安裝與配置,我在《入門篇》進行了詳細講解,有需要的朋友可以前往閱讀,本文進入當下比較火熱的區塊鏈專案 - 以太坊(go-ethereum)進行原始碼解讀。本文內容純屬個人見解,有錯誤理解或者不足之處還請見諒,歡迎一起交流學習。    - 環境準備    -

AFNetworking3.1.0原始碼分析整體框架和功能模組

簡介 1:基於系統NSURLSession類族封裝完成HPPT/HPPTS(GET,PUT,PSOT,DELEATE,HEAD)網路請求 2:擴充套件部分UIKit控制元件,比如擴充套件UIIMag

OkHttp 3.7原始碼分析——整體架構

OkHttp是一個處理網路請求的開源專案,是Android端最火熱的輕量級框架,由移動支付Square公司貢獻用於替代HttpUrlConnection和Apache HttpClient。隨著OkHttp的不斷成熟,越來越多的Android開發者使用OkHtt

SpringMVC原始碼剖析SpringMVC整體架構分析和建立

先看一下Servlet的繼承結 前面的Servlet體系我都有講過HttpServlet實現了根據動作分發請求 其他結構重要的類為HttpServletBean,FrameworkServlet ,DispatcherServlet 在Spring中實現了XXXAware

Flume NG原始碼分析基於靜態properties檔案的配置模組

日誌收集是網際網路公司的一個重要服務,Flume NG是Apache的頂級專案,是分散式日誌收集服務的一個開源實現,具有良好的擴充套件性,與其他很多開源元件可以無縫整合。搜了一圈發現介紹Flume NG的文章有不少,但是深入分析Flume NG原始碼的卻沒有。準備寫一個系列分析一下Flume NG的

GCC原始碼分析——介紹與安裝

原文連結:http://blog.csdn.net/sonicling/article/details/6702031     上半年一直在做有關GCC和LD的專案,到現在還沒做完。最近幾天程式設計的那臺電腦壞了,所以趁此間隙寫一點相關的分析和

Hibernate使用及原始碼分析

Hibernate使用及原始碼分析(一) 本篇文章主要通過hibernate初級使用分析一下原始碼,只是給初學者一點小小的建議,不喜勿噴,謝謝! hibernate環境搭建 簡單使用 原始碼走讀 一 hibernate環境搭建 這裡直接

SpringCloud原始碼分析--客戶端搭建

一、前言 上一節的註冊中心搭建完成了,本節開始搭建客戶端,其實對於springcloud的Eureka註冊中心而言,他本身就是服務端也是客戶端,我們上節待見服務端註冊中心的時候,已經通過配置來設定其不向自己註冊,和不去檢索服務的功能,保持了其作為服務註冊中心的相對的功能單一性。 二、pom檔案

Vue原始碼分析:入口檔案

Vue原始碼分析(一):入口檔案   首先開啟命令列,從github下載原始碼,下載到自己的工作目錄。 git clone https://github.com/vuejs/vue.git   這裡我下載的是2.5.17版本的,vue 原始碼是由各種模組用 rollup 工具

okhttp原始碼分析——基本流程超詳細

1.okhttp原始碼分析(一)——基本流程(超詳細) 2.okhttp原始碼分析(二)——RetryAndFollowUpInterceptor過濾器 3.okhttp原始碼分析(三)——CacheInterceptor過濾器 4.okhttp原始碼分析(四)——Conn

spring事務管理原始碼分析配置和事務增強代理的生成流程

在本篇文章中,將會介紹如何在spring中進行事務管理,之後對其內部原理進行分析。主要涉及 @EnableTransactionManagement註解為我們做了什麼? 為什麼標註了@Transactional註解的方法就可以具有事務的特性,保持了資料的ACID特性?spring到底是如何具有這樣

tornado原始碼分析iostream

在事件驅動模型中,所有任務都是以某個事件的回撥函式的方式新增至事件迴圈中的,如:HTTPServer要從socket中讀取客戶端傳送的request訊息,就必須將該socket新增至ioloop中,並設定回掉函式,在回掉函式中從socket中讀取資料,並且檢查request訊息是否全部接收到了,如果

Android系統播放器MediaPlayer原始碼分析

前言 對於MediaPlayer播放器的原始碼分析內容相對來說比較多,會從Java->JNI->C/C++慢慢分析,後面會慢慢更新。另外,部落格只作為自己學習記錄的一種方式,對於其他的不過多的評論。 MediaPlayerDemo public class MainA

Android7.1 [Camera] Camera Hal 原始碼分析

原始碼平臺:rk3399   命令列ls看下原始碼的結構 hardware/rockchip/camera/CameraHal: lib目錄 原始碼的檔案看起來有點多,我們看看Android.mk檔案, 這些檔案最終編譯成camera.rk30bo