圖解 Docker 架構

Docker的總架構圖

圖片

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

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

Docker各模塊組件分析

Docker Client【發起請求】
  • Docker Client是和Docker Daemon創建通訊的客戶端。用戶使用的可執行文件爲docker(相似可執行腳本的命令),docker命令後接參數的形式來實現一個完整的請求命令(例如docker images,docker爲命令不可變,images爲參數可變)。
  • Docker Client能夠經過如下三種方式和Docker Daemon創建通訊:tcp://host:port,unix://path_to_socket和fd://socketfd。
  • Docker Client發送容器管理請求後,由Docker Daemon接受並處理請求,當Docker Client接收到返回的請求相應並簡單處理後,Docker Client一次完整的生命週期就結束了。(一次完整的請求:發送請求→處理請求→返回結果),與傳統的C/S架構請求流程並沒有不一樣。
Docker Daemon【後臺守護進程】
  • Docker Daemon的架構圖

圖片

Docker Server【調度分發請求】
  • Docker Server的架構圖

圖片

  • Docker Server至關於C/S架構的服務端。功能爲接受並調度分發Docker Client發送的請求。接受請求後,Server經過路由與分發調度,找到相應的Handler來執行請求。
  • 在Docker的啓動過程當中,經過包gorilla/mux,建立了一個mux.Router,提供請求的路由功能。在Golang中,gorilla/mux是一個強大的URL路由器以及調度分發器。該mux.Router中添加了衆多的路由項,每個路由項由HTTP請求方法(PUT、POST、GET或DELETE)、URL、Handler三部分組成。
  • 建立完mux.Router以後,Docker將Server的監聽地址以及mux.Router做爲參數,建立一個httpSrv=http.Server{},最終執行httpSrv.Serve()爲請求服務。
  • 在Server的服務過程當中,Server在listener上接受Docker Client的訪問請求,並建立一個全新的goroutine來服務該請求。在goroutine中,首先讀取請求內容,而後作解析工做,接着找到相應的路由項,隨後調用相應的Handler來處理該請求,最後Handler處理完請求以後回覆該請求。
Engine
  • Engine是Docker架構中的運行引擎,同時也Docker運行的核心模塊。它扮演Docker container存儲倉庫的角色,而且經過執行job的方式來操縱管理這些容器。
  • 在Engine數據結構的設計與實現過程當中,有一個handler對象。該handler對象存儲的都是關於衆多特定job的handler處理訪問。舉例說明,Engine的handler對象中有一項爲:{"create": daemon.ContainerCreate,},則說明當名爲"create"的job在運行時,執行的是daemon.ContainerCreate的handler。
job
  • 一個Job能夠認爲是Docker架構中Engine內部最基本的工做執行單元。Docker能夠作的每一項工做,均可以抽象爲一個job。例如:在容器內部運行一個進程,這是一個job;建立一個新的容器,這是一個job。Docker Server的運行過程也是一個job,名爲serveapi。
  • Job的設計者,把Job設計得與Unix進程相仿。好比說:Job有一個名稱,有參數,有環境變量,有標準的輸入輸出,有錯誤處理,有返回狀態等。

Docker Registry【鏡像註冊中心】

  • Docker Registry是一個存儲容器鏡像的倉庫(註冊中心),可理解爲雲端鏡像倉庫,按repository來分類,docker pull 按照[repository]:[tag]來精肯定義一個image。
  • 在Docker的運行過程當中,Docker Daemon會與Docker Registry通訊,並實現搜索鏡像、下載鏡像、上傳鏡像三個功能,這三個功能對應的job名稱分別爲"search","pull" 與 "push"。
  • 可分爲公有倉庫(docker hub)和私有倉庫。

Graph【docker內部數據庫】

  • Graph的架構圖

圖片

  • Repository
  • 已下載鏡像的保管者(包括下載鏡像和dockerfile構建的鏡像)。
  • 一個repository表示某類鏡像的倉庫(例如Ubuntu),同一個repository內的鏡像用tag來區分(表示同一類鏡像的不一樣標籤或版本)。一個registry包含多個repository,一個repository包含同類型的多個image。
  • 鏡像的存儲類型有aufs,devicemapper,Btrfs,Vfs等。其中centos系統使用devicemapper的存儲類型。
  • 同時在Graph的本地目錄中,關於每個的容器鏡像,具體存儲的信息有:該容器鏡像的元數據,容器鏡像的大小信息,以及該容器鏡像所表明的具體rootfs。
  • GraphDB
  • 已下載容器鏡像之間關係的記錄者。
  • GraphDB是一個構建在SQLite之上的小型圖數據庫,實現了節點的命名以及節點之間關聯關係的記錄

Driver【執行部分】

Driver是Docker架構中的驅動模塊。經過Driver驅動,Docker能夠實現對Docker容器執行環境的定製。即Graph負責鏡像的存儲,Driver負責容器的執行。數據庫

graphdriver
  • graphdriver架構圖

圖片

  • graphdriver主要用於完成容器鏡像的管理,包括存儲與獲取。
  • 存儲:docker pull下載的鏡像由graphdriver存儲到本地的指定目錄(Graph中)。
  • 獲取:docker run(create)用鏡像來建立容器的時候由graphdriver到本地Graph中獲取鏡像。
networkdriver
  • networkdriver的架構圖

圖片

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

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

圖片

  • execdriver做爲Docker容器的執行驅動,負責建立容器運行命名空間,負責容器資源使用的統計與限制,負責容器內部進程的真正運行等。
  • 如今execdriver默認使用native驅動,不依賴於LXC。

libcontainer【函數庫】

libcontainer的架構圖

圖片

  • libcontainer是Docker架構中一個使用Go語言設計實現的庫,設計初衷是但願該庫能夠不依靠任何依賴,直接訪問內核中與容器相關的API。
  • Docker能夠直接調用libcontainer,而最終操縱容器的namespace、cgroups、apparmor、網絡設備以及防火牆規則等。
  • libcontainer提供了一整套標準的接口來知足上層對容器管理的需求。或者說,libcontainer屏蔽了Docker上層對容器的直接管理。

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

container架構

圖片

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

Docker按照用戶的需求與指令,訂製相應的Docker容器:api

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

做者:胡偉煌
https://blog.csdn.net/huwh\_/article/details/71308236安全

相關文章
相關標籤/搜索