概述java
今天主要簡單介紹下docker的技術架構及其中組成的各個模塊。golang
技術架構面試
distribution 負責與docker registry交互,上傳洗澡鏡像以及v2 registry 有關的源數據docker
registry負責docker registry有關的身份認證、鏡像查找、鏡像驗證以及管理registry mirror等交互操做。數據庫
image 負責與鏡像源數據有關的存儲、查找,鏡像層的索引、查找以及鏡像tar包有關的導入、導出操做。編程
reference負責存儲本地全部鏡像的repository和tag名,並維護與鏡像id之間的映射關係。安全
layer模塊負責與鏡像層和容器層源數據有關的增刪改查,並負責將鏡像層的增刪改查映射到實際存儲鏡像層文件的graphdriver模塊。網絡
graghdriver是全部與容器鏡像相關操做的執行者。數據結構
一、docker client架構
docker client 是docker架構中用戶用來和docker daemon創建通訊的客戶端,用戶使用的可執行文件爲docker,經過docker命令行工具能夠發起衆多管理container的請求。
docker client發送容器管理請求後,由docker daemon接受並處理請求,當docker client 接收到返回的請求相應並簡單處理後,docker client 一次完整的生命週期就結束了,當須要繼續發送容器管理請求時,用戶必須再次經過docker能夠執行文件建立docker client。
二、docker daemon
docker daemon 是docker架構中一個常駐在後臺的系統進程,功能是:接收處理docker client發送的請求。該守護進程在後臺啓動一個server,server負載接受docker client發送的請求;接受請求後,server經過路由與分發調度,找到相應的handler來執行請求。
docker daemon啓動所使用的可執行文件也爲docker,與docker client啓動所使用的可執行文件docker相同,在docker命令執行時,經過傳入的參數來判別docker daemon與docker client。
三、docker server
docker server在docker架構中時專門服務於docker client的server,該server的功能時:接受並調度分發docker client發送的請求,架構圖以下:
在Docker的啓動過程當中,經過包gorilla/mux(golang的類庫解析),建立了一個mux.Router,提供請求的路由功能。在Golang中,gorilla/mux是一個強大的URL路由器以及調度分發器。該mux.Router中添加了衆多的路由項,每個路由項由HTTP請求方法(PUT、POST、GET或DELETE)、URL、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,從Internet上下載一個文檔,這是一個job;包括以前在Docker Server部分說過的,建立Server服務於HTTP的API,這也是一個job,等等。
Job的設計者,把Job設計得與Unix進程相仿。好比說:Job有一個名稱,有參數,有環境變量,有標準的輸入輸出,有錯誤處理,有返回狀態等。
六、docker registry
Docker Registry是一個存儲容器鏡像的倉庫。而容器鏡像是在容器被建立時,被加載用來初始化容器的文件架構與目錄。
在Docker的運行過程當中,Docker Daemon會與Docker Registry通訊,並實現搜索鏡像、下載鏡像、上傳鏡像三個功能,這三個功能對應的job名稱分別爲」search」,」pull」 與 「push」。
其中,在Docker架構中,Docker可使用公有的Docker Registry,即你們熟知的Docker Hub,如此一來,Docker獲取容器鏡像文件時,必須經過互聯網訪問Docker Hub;同時Docker也容許用戶構建本地私有的Docker Registry,這樣能夠保證容器鏡像的獲取在內網完成。
七、Graph
Graph在Docker架構中扮演已下載容器鏡像的保管者,以及已下載容器鏡像之間關係的記錄者。一方面,Graph存儲着本地具備版本信息的文件系統鏡像,另外一方面也經過GraphDB記錄着全部文件系統鏡像彼此之間的關係。Graph的架構以下:
其中,GraphDB是一個構建在SQLite之上的小型圖數據庫,實現了節點的命名以及節點之間關聯關係的記錄。它僅僅實現了大多數圖數據庫所擁有的一個小的子集,可是提供了簡單的接口表示節點之間的關係。
同時在Graph的本地目錄中,關於每個的容器鏡像,具體存儲的信息有:該容器鏡像的元數據,容器鏡像的大小信息,以及該容器鏡像所表明的具體rootfs。
八、driver
Driver是Docker架構中的驅動模塊。經過Driver驅動,Docker能夠實現對Docker容器執行環境的定製。因爲Docker運行的生命週期中,並不是用戶全部的操做都是針對Docker容器的管理,另外還有關於Docker運行信息的獲取,Graph的存儲與記錄等。所以,爲了將Docker容器的管理從Docker Daemon內部業務邏輯中區分開來,設計了Driver層驅動來接管全部這部分請求。
九、libcontainer
libcontainer是Docker架構中一個使用Go語言設計實現的庫,設計初衷是但願該庫能夠不依靠任何依賴,直接訪問內核中與容器相關的API。
正是因爲libcontainer的存在,Docker能夠直接調用libcontainer,而最終操縱容器的namespace、cgroups、apparmor、網絡設備以及防火牆規則等。這一系列操做的完成都不須要依賴LXC或者其餘包。libcontainer架構以下:
另外,libcontainer提供了一整套標準的接口來知足上層對容器管理的需求。或者說,libcontainer屏蔽了Docker上層對容器的直接管理。又因爲libcontainer使用Go這種跨平臺的語言開發實現,且自己又能夠被上層多種不一樣的編程語言訪問,所以很難說,將來的Docker就必定會牢牢地和Linux捆綁在一塊兒。而於此同時,Microsoft在其著名雲計算平臺Azure中,也添加了對Docker的支持,可見Docker的開放程度與業界的火熱度。
十、docker container
Docker container(Docker容器)是Docker架構中服務交付的最終體現形式。
Docker按照用戶的需求與指令,訂製相應的Docker容器:
用戶經過指定容器鏡像,使得Docker容器能夠自定義rootfs等文件系統; 用戶經過指定計算資源的配額,使得Docker容器使用指定的計算資源; 用戶經過配置網絡及其安全策略,使得Docker容器擁有獨立且安全的網絡環境; 用戶經過指定運行的命令,使得Docker容器執行指定的工做。
最後,小編分類整理了許多java進階學習材料和BAT面試給熱愛IT行業的你,若是須要資料的請轉發此文章後再私聊小編回覆【java】就能領取2019年java進階學習資料和BAT面試題以及《Effective Java》(第3版)電子版書籍。也能夠加羣:712263501領取海量學習資料進行學習。