[Docker] Docker整體架構圖


https://www.huweihuang.com/article/docker/docker-architecture/

一、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建立通信:tcp://host:port,unix://path_to_socket和fd://socketfd。
  3. 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源碼分析》基礎上進行整理。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM