a.更快速的支付和部署:開發者可以使用一個標準的鏡像來構建一套開發容器 ,開發完成之后,運維人員可以直接使用這個容器來部署代碼。
? ? ? b.更高效的虛擬化: Docker容器的運行不需要額外的hypervisor支持,它是內核級的虛擬化,因此
? ? ? 可以實現更高的性能和效。 ?I ?0c更輕松的遷移和擴展: Docker容器幾乎可以在任意的平臺上運行,包括物理機、虛擬機、公有云、私有云、個人電腦、服務器等。率。
? ? ? d.更簡單的管理:使用Docker ,只需要小小的修改,就可以替代以往大量的更新工作。所有的修改都
? ? ? 以增量的方式被分發和更新,從而實現自動化并且高效的管理。 ?三
? ? ? ,3.與傳統虛擬機的對比 :
? ? ? 特性 ?容器 ?虛擬機后動 ?穢級 ?分鐘級
?
2.鏡像:是一個只讀的模板,例如一個完整的Centos操作系統
? ?
從上圖不難看出,用戶是使用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 daemon就是docker的守護進程即server端,可以是遠程的,也可以是本地的,這個不是C/S架構嗎,客戶端Docker client 是通過rest api進行通信。
?
docker cli 用來管理容器和鏡像,客戶端提供一個只讀鏡像,然后通過鏡像可以創建多個容器,這些容器可以只是一個RFS(Root file system根文件系統),也可以ishi一個包含了用戶應用的RFS,容器再docker client中只是要給進程,兩個進程之間互不可見。
?
用戶不能與server直接交互,但可以通過與容器這個橋梁來交互,由于是操作系統級別的虛擬技術,中間的損耗幾乎可以不計
主要的模塊有:Docker Client、Docker Daemon、Docker Registry、Graph、Driver、libcontainer以及Docker container。
?
1、docker client
?
docker client 是docker架構中用戶用來和docker daemon建立通信的客戶端,用戶使用的可執行文件為docker,通過docker命令行工具可以發起眾多管理container的請求。
?
docker client可以通過一下三宗方式和docker daemon建立通信:tcp://host:port;unix:path_to_socket;fd://socketfd。,docker client可以通過設置命令行flag參數的形式設置安全傳輸層協議(TLS)的有關參數,保證傳輸的安全性
?
docker client發送容器管理請求后,由docker daemon接受并處理請求,當docker client 接收到返回的請求相應并簡單處理后,docker client 一次完整的生命周期就結束了,當需要繼續發送容器管理請求時,用戶必須再次通過docker可以執行文件創建docker client。
2、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 daemon的架構可以分為:docker server、engine、job。daemon
3、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三部分組成。
?
若Docker Client通過HTTP的形式訪問Docker Daemon,創建完mux.Router之后,Docker將Server的監聽地址以及mux.Router作為參數,創建一個httpSrv=http.Server{},最終執行httpSrv.Serve()為請求服務。
?
在Server的服務過程中,Server在listener上接受Docker Client的訪問請求,并創建一個全新的goroutine來服務該請求。在goroutine中,首先讀取請求內容,然后做解析工作,接著找到相應的路由項,隨后調用相應的Handler來處理該請求,最后Handler處理完請求之后回復該請求。
?
需要注意的是:Docker Server的運行在Docker的啟動過程中,是靠一個名為”serveapi”的job的運行來完成的。原則上,Docker Server的運行是眾多job中的一個,但是為了強調Docker Server的重要性以及為后續job服務的重要特性,將該”serveapi”的job單獨抽離出來分析,理解為Docker Server。
4、engine
?
Engine是Docker架構中的運行引擎,同時也Docker運行的核心模塊。它扮演Docker container存儲倉庫的角色,并且通過執行job的方式來操縱管理這些容器。
?
在Engine數據結構的設計與實現過程中,有一個handler對象。該handler對象存儲的都是關于眾多特定job的handler處理訪問。舉例說明,Engine的handler對象中有一項為:{“create”: daemon.ContainerCreate,},則說明當名為”create”的job在運行時,執行的是daemon.ContainerCreate的handler。
5、job
?
一個Job可以認為是Docker架構中Engine內部最基本的工作執行單元。Docker可以做的每一項工作,都可以抽象為一個job。例如:在容器內部運行一個進程,這是一個job;創建一個新的容器,這是一個job,從Internet上下載一個文檔,這是一個job;包括之前在Docker Server部分說過的,創建Server服務于HTTP的API,這也是一個job,等等。
?
Job的設計者,把Job設計得與Unix進程相仿。比如說:Job有一個名稱,有參數,有環境變量,有標準的輸入輸出,有錯誤處理,有返回狀態等。
6、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,這樣可以保證容器鏡像的獲取在內網完成。
7、Graph
?
Graph在Docker架構中扮演已下載容器鏡像的保管者,以及已下載容器鏡像之間關系的記錄者。一方面,Graph存儲著本地具有版本信息的文件系統鏡像,另一方面也通過GraphDB記錄著所有文件系統鏡像彼此之間的關系。
?
Graph的架構如下:
?
其中,GraphDB是一個構建在SQLite之上的小型圖數據庫,實現了節點的命名以及節點之間關聯關系的記錄。它僅僅實現了大多數圖數據庫所擁有的一個小的子集,但是提供了簡單的接口表示節點之間的關系。
?
?
同時在Graph的本地目錄中,關于每一個的容器鏡像,具體存儲的信息有:該容器鏡像的元數據,容器鏡像的大小信息,以及該容器鏡像所代表的具體rootfs。
?
8、driver
?
Driver是Docker架構中的驅動模塊。通過Driver驅動,Docker可以實現對Docker容器執行環境的定制。由于Docker運行的生命周期中,并非用戶所有的操作都是針對Docker容器的管理,另外還有關于Docker運行信息的獲取,Graph的存儲與記錄等。因此,為了將Docker容器的管理從Docker Daemon內部業務邏輯中區分開來,設計了Driver層驅動來接管所有這部分請求。
?
在Docker Driver的實現中,可以分為以下三類驅動:graphdriver、networkdriver和execdriver。
?
graphdriver主要用于完成容器鏡像的管理,包括存儲與獲取。即當用戶需要下載指定的容器鏡像時,graphdriver將容器鏡像存儲在本地的指定目錄;同時當用戶需要使用指定的容器鏡像來創建容器的rootfs時,graphdriver從本地鏡像存儲目錄中獲取指定的容器鏡像。
?
在graphdriver的初始化過程之前,有4種文件系統或類文件系統在其內部注冊,它們分別是aufs、btrfs、vfs和devmapper。而Docker在初始化之時,通過獲取系統環境變量”DOCKER_DRIVER”來提取所使用driver的指定類型。而之后所有的graph操作,都使用該driver來執行。
?
graphdriver的架構如下:
networkdriver的用途是完成Docker容器網絡環境的配置,其中包括Docker啟動時為Docker環境創建網橋;Docker容器創建時為其創建專屬虛擬網卡設備;以及為Docker容器分配IP、端口并與宿主機做端口映射,設置容器防火墻策略等。networkdriver的架構如下:
?
execdriver作為Docker容器的執行驅動,負責創建容器運行命名空間,負責容器資源使用的統計與限制,負責容器內部進程的真正運行等。在execdriver的實現過程中,原先可以使用LXC驅動調用LXC的接口,來操縱容器的配置以及生命周期,而現在execdriver默認使用native驅動,不依賴于LXC。具體體現在Daemon啟動過程中加載的ExecDriverflag參數,該參數在配置文件已經被設為”native”。這可以認為是Docker在1.2版本上一個很大的改變,或者說Docker實現跨平臺的一個先兆。execdriver架構如下:
9、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,由于libcontainer的功能以及其本身與系統的松耦合特性,很有可能會在其他以容器為原型的平臺出現,同時也很有可能催生出云計算領域全新的項目。
10、docker container
?
Docker container(Docker容器)是Docker架構中服務交付的最終體現形式。
?
Docker按照用戶的需求與指令,訂制相應的Docker容器:
?
-
用戶通過指定容器鏡像,使得Docker容器可以自定義rootfs等文件系統;
-
用戶通過指定計算資源的配額,使得Docker容器使用指定的計算資源;
-
用戶通過配置網絡及其安全策略,使得Docker容器擁有獨立且安全的網絡環境;
-
用戶通過指定運行的命令,使得Docker容器執行指定的工作。
?
?
?
?
?
? 鏡像可以用來創建Docker容器, Docker中提供了一個很簡單的方式來常見鏡像和更新鏡像 ,甚至可以從其他地方直接拷貝已經做好的鏡像直接使用。鏡像有點類似于編程中的Class類,在運行的時候生成對象。
? ? ? 3.容器:是從鏡像創建并運行的實例,就像一個啟動好了的播放器程序,它可以被開始,停止,啟動和刪除。每個容器都是相互隔離的,絕對保證安全。
? ? ? 你可以把容易看成一個啟動了的L iunx簡化版系統,里面包括root用戶權限,進程空間,用戶空間和網絡空間,還包括運行在里面的應用程序。
? ? ? 4.倉庫:是集中存放鏡像文件的地方。還有一種服務叫做 倉庫注冊服務器(可以理解為GitHub這樣的托管服務器) , 里面存放著多個倉庫,每個倉庫中又包含多個鏡像,每個鏡像又有不同的標簽。倉庫的概念有點類似于Git,也分為公有倉庫和私有倉庫,全世界對打的Docker倉庫是Docker Hub,國內最大的Docker倉庫是Docker Pool.
? ? ? 用戶可以在本地網絡或者服務器上創建一個私有倉庫 ,當用戶創建了一個自己的鏡像之后,使用push
?
docker run -t -i ceos /bin/bash創建容器 ?
-t分配一個偽終端綁定容器標準輸入上面 ?-i讓容器標注輸入保持打開
1.檢查本地鏡像是否存在指定的鏡像,不存在則從公共倉庫下載
2.使用鏡像創建并啟動容器
3.分配一個文件系統,并在只讀的鏡像層外面掛載一層可讀可寫層
4.從宿主機配置的網橋接口中橋接一個虛擬接口到容器中去
5.從地址池分配一個ip地址給容器
6.執行用戶指定的用戶程序
7.執行完畢之后程序終止