您好,登錄后才能下訂單哦!
對Docker不太熟悉的朋友可以參考博文:Docker簡介及安裝配置詳解
首先Docker是基于Go語言進行開發的,而且是基于C/S結構進行工作的,如圖:
從圖中可以看出:
(1)用戶是使用Docker Client與Docker Daemon建立通信,并發送請求給后者;
(2)Docker Daemon作為Docker架構中的主體部分,首先提供Server的功能使其可以接受Docker Client的請求;而后Engine(引擎)執行Docker內部的一系列工作,每一項工作都是以一個Job的形式存在;
(3)Job的運行過程中,當需要容器鏡像時,則從Docker Registry(docker倉庫)中下載鏡像,并通過graphdriver(鏡像管理驅動)將下載鏡像以Graph(圖像)的形式存儲;當需要為Docker創建網絡環境時,通過networkdriver(網絡管理驅動)創建并配置Docker容器網絡環境;當需要限制Docker容器運行資源或執行用戶指令等操作時,則通過execdriver(執行管理驅動)來完成。
(4)libcontainer(容器庫)是一項獨立的容器管理包,networkdriver以及execdriver都是通過libcontainer來實現具體對容器進行的操作。當執行完運行容器的命令后,一個實際的Docker容器就處于運行狀態,該容器擁有獨立的文件系統,獨立并且安全的運行環境等。
docker client是docker架構中用戶用來和docker daemon建立通信的客戶端,用戶可以通過docker命令行工具發起眾多管理docker container的請求。
docker client發送容器管理請求后,由docker daemon接受并處理請求,當docker client接收到返回的請求相應并簡單處理后,docker client一次完整的生命周期就已經結束了。
docker daemon 是docker架構中一個常駐在后臺的系統進程,功能就是:接收處理docker client發送的請求。該守護進程在后臺啟動一個server,server負載接受docker client發送的請求;接受請求后,server通過路由與分發調度,找到相應的handler(處理器)來執行請求。
docker server在docker架構中是專門服務于docker client的server,該server的功能就是:接受并調度分發docker client發送的請求。
Engine是Docker架構中的運行引擎,同時也Docker運行的核心模塊。它扮演Docker container存儲倉庫的角色,并且通過執行job的方式來操縱管理這些容器。
一個Job可以認為是Docker架構中Engine內部最基本的工作執行單元,Docker可以做的每一項工作,都可以抽象為一個job。
Docker Registry是一個存儲容器鏡像的倉庫。而容器鏡像是在容器被創建時,被加載用來初始化容器的文件架構與目錄。
Graph在Docker架構中扮演已下載容器鏡像的保管者,以及已下載容器鏡像之間關系的記錄者。一方面,Graph存儲著本地具有版本信息的文件系統鏡像,另一方面也通過GraphDB記錄著所有文件系統鏡像彼此之間的關系。
Driver是Docker架構中的驅動模塊。通過Driver驅動,Docker可以實現對Docker容器執行環境的定制。由于Docker運行的生命周期中,并非用戶所有的操作都是針對Docker容器的管理,另外還有關于Docker運行信息的獲取,Graph的存儲與記錄等。因此,為了將Docker容器的管理從Docker Daemon內部業務邏輯中區分開來,設計了Driver層驅動來接管所有這部分請求。
在Docker Driver的實現中,可以分為以下三類驅動:
- graphdriver主要用于完成容器鏡像的管理,包括存儲與獲取。即當用戶需要下載指定的容器鏡像時,graphdriver將容器鏡像存儲在本地的指定目錄;同時當用戶需要使用指定的容器鏡像來創建容器的rootfs時,graphdriver從本地鏡像存儲目錄中獲取指定的容器鏡像;
- networkdriver的用途是完成Docker容器網絡環境的配置,其中包括Docker啟動時為Docker環境創建網橋;Docker容器創建時為其創建專屬虛擬網卡設備;以及為Docker容器分配IP、端口并與宿主機做端口映射,設置容器防火墻策略等;
- execdriver作為Docker容器的執行驅動,負責創建容器運行命名空間,負責容器資源使用的統計與限制,負責容器內部進程的真正運行等。在execdriver的實現過程中,原先可以使用LXC驅動調用LXC的接口,來操縱容器的配置以及生命周期,而現在execdriver默認使用native驅動,不依賴于LXC。具體體現在Daemon啟動過程中加載的ExecDriverflag參數,該參數在配置文件已經被設為”native”;
libcontainer是Docker架構中一個使用Go語言設計實現的庫,設計初衷是希望該庫可以不依靠任何依賴,直接訪問內核中與容器相關的API。正是由于libcontainer的存在,Docker可以直接調用libcontainer,而最終操縱容器的namespace、cgroups、apparmor、網絡設備以及防火墻規則等。
Docker container(Docker容器)是Docker架構中服務交付的最終體現形式。Docker按照用戶的需求與指令,訂制相應的Docker容器。用戶通過指定容器鏡像,使得Docker容器可以自定義rootfs等文件系統; 用戶通過指定計算資源的配額,使得Docker容器使用指定的計算資源; 用戶通過配置網絡及其安全策略,使得Docker容器擁有獨立且安全的網絡環境; 用戶通過指定運行的命令,使得Docker容器執行指定的工作。
如果想對Docker有更加深入的研究可以參考博文:Docker架構原理及簡單使用
————————————本文到此結束,感謝觀看——————————————
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。