DevOps專題(一)Docker架構及其知識腦圖

Docker 的總體架構

Docker 是一個 C/S 模式的架構,後端是一個松耦合架構,模塊各司其職。下圖是它的總體架構圖:

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

Docker 各模塊組件分析

1. Docker Client「發起請求」

1 Docker Client 是 和 Docker Daemon 建立通信的客戶端。用戶使用的可執行文件爲 docker(一個命令行可執行文件),docker 命令使用後接參數的形式來實現一個完整的請求命令(例如:docker images,docker 爲命令不可變,images 爲參數可變)。

2 Docker Client 可以通過以下三種方式和 Docker Daemon 建立通信:tcp://host:port、unix://pathtosocket 和 fd://socketfd

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

2. Docker Daemon(後臺守護進程)

Docker Server 架構圖

  1. Docker Server 相當於 C/S 架構的服務端。功能爲接受並調度分發 Docker Client 發送的請求。接受請求後,Docker 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. 在 Docker Server 的服務過程中,Docker Server 在 listener 上接受 Docker Client 的訪問請求,並創建一個全新的 goroutine 來服務該請求。在 goroutine 中,首先讀取請求內容並做解析工作,接着找到相應的路由項並調用相應的 Handler 來處理該請求,最後 Handler 處理完請求之後回覆該請求。

3. Docker Engine

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

Job

  1. 一個 Job 可以認爲是 Docker 架構中 Docker Engine 內部最基本的工作執行單元。Docker 可以做的每一項工作,都可以抽象爲一個 Job。例如:在容器內部運行一個進程,這是一個 Job;創建一個新的容器,這是一個 Job。 Docker Server 的運行過程也是一個 Job,名爲 ServeApi。
  2. Job 的設計者,把 Job 設計得與 Unix 進程相仿。比如說:Job 有一個名稱、有參數、有環境變量、有標準的輸入輸出、有錯誤處理,有返回狀態等。

4. Docker Registry(鏡像註冊中心)

  1. Docker Registry 是一個存儲容器鏡像的倉庫(註冊中心),可理解爲雲端鏡像倉庫。按 Repository 來分類,docker pull 按照 [repository]:[tag] 來精確定義一個具體的 Image。
  2. 在 Docker 的運行過程中,Docker Daemon 會與 Docker Registry 通信,並實現搜索鏡像、下載鏡像、上傳鏡像三個功能,這三個功能對應的 Job 名稱分別爲: “search”、”pull” 與 “push”。
  3. Docker Registry 可分爲公有倉庫( Docker Hub)和私有倉庫。

5. Graph 「Docker 內部數據庫」

Graph 架構圖

Repository

  1. 已下載鏡像的保管者(包括下載的鏡像和通過 Dockerfile 構建的鏡像)。
  2. 一個 Repository 表示某類鏡像的倉庫(例如:Ubuntu),同一個 Repository 內的鏡像用 Tag 來區分(表示同一類鏡像的不同標籤或版本)。一個 Registry 包含多個Repository,一個 Repository 包含同類型的多個 Image。
  3. 鏡像的存儲類型有 Aufs、Devicemapper、Btrfs、Vfs等。其中 CentOS 系統 7.x 以下版本使用 Devicemapper 的存儲類型。
  4. 同時在 Graph 的本地目錄中存儲有關於每一個的容器鏡像具體信息,包含有:該容器鏡像的元數據、容器鏡像的大小信息、以及該容器鏡像所代表的具體 rootfs。

GraphDB

  1. 已下載容器鏡像之間關係的記錄者。
  2. GraphDB 是一個構建在 SQLite 之上的小型數據庫,實現了節點的命名以及節點之間關聯關係的記錄。

6. Driver 「執行部分」

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

Graphdriver

Graphdriver 架構圖

  1. Graphdriver 主要用於完成容器鏡像的管理,包括存儲與獲取。
  2. 存儲:docker pull 下載的鏡像由 Graphdriver 存儲到本地的指定目錄( Graph 中 )。
  3. 獲取:docker run(create)用鏡像來創建容器的時候由 Graphdriver 到本地 Graph中獲取鏡像。

Networkdriver

Networkdriver 架構圖

Networkdriver 的用途是完成 Docker 容器網絡環境的配置,其中包括:

  • Docker 啓動時爲 Docker 環境創建網橋。
  • Docker 容器創建時爲其創建專屬虛擬網卡設備。
  • Docker 容器分配IP、端口並與宿主機做端口映射,設置容器防火牆策略等。

Execdriver

Execdriver 架構圖

  1. Execdriver 作爲 Docker 容器的執行驅動,負責創建容器運行命名空間、容器資源使用的統計與限制、容器內部進程的真正運行等。
  2. 現在 Execdriver 默認使用 Native 驅動,不依賴於 LXC。

7. Libcontainer 「函數庫」

Libcontainer 架構圖

  1. Libcontainer 是 Docker 架構中一個使用 Go 語言設計實現的庫,設計初衷是希望該庫可以不依靠任何依賴,直接訪問內核中與容器相關的 API。
  2. Docker 可以直接調用 Libcontainer 來操縱容器的 Namespace、Cgroups、Apparmor、網絡設備以及防火牆規則等。
  3. Libcontainer 提供了一整套標準的接口來滿足上層對容器管理的需求。或者說 Libcontainer 屏蔽了 Docker 上層對容器的直接管理。

8. Docker Container 「服務交付的最終形式」

Docker Container 架構

  1. Docker Container( Docker 容器 )是 Docker 架構中服務交付的最終體現形式。
  2. Docker 按照用戶的需求與指令,訂製相應的 Docker 容器:
  • 用戶通過指定容器鏡像,使得 Docker 容器可以自定義 rootfs 等文件系統。
  • 用戶通過指定計算資源的配額,使得 Docker 容器使用指定的計算資源。
  • 用戶通過配置網絡及其安全策略,使得 Docker 容器擁有獨立且安全的網絡環境。
  • 用戶通過指定運行的命令,使得 Docker 容器執行指定的工作。

Docker知識腦圖

Docker知識腦圖

參考文檔:https://pic2.zhimg.com/80/v2-9b568066b44c312ef9becf2470f874c5_720w.jpg
                  https://zhuanlan.zhihu.com/p/92958486

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章