1. 程式人生 > >Docker系列(一):docker簡單介紹

Docker系列(一):docker簡單介紹

docker簡介:

多語言和框架:支援多語言和框架以及語言框架的擴充套件機制
多服務:開放的核心服務以及服務的擴充套件機制
多雲和多IaaS技術:支援多種IaaS技術和多雲的部署,包括公有云和私有云
Docker----------第三代Paas平臺
Docker究竟是什麼?dotCloud不僅支援諸如PHP、MySql等傳統技術框架,還包括Node.js、MongoDB等新興技術。基於dotCloud提供的開發工具和技術框架,你可以直接使用dotCloud的SDK 編寫程式碼和構建業務服務,並在聯網的時候把這些程式碼推送到雲端,實現自動部署和測試。

原理

Docker就是虛擬化的一種輕量級替代技術。Docker的容器技術不依賴任何語言、框架或系統,可以將App變成一種標準化的、可移植的、自管理的元件,並脫離伺服器硬體在任何主流系統中開發、除錯和執行簡單的說就是,在Linux 系統上迅速建立一個容器(類似虛擬機器)並在容器上部署和執行應用程式,並通過配置檔案可以輕鬆實現應用程式的自動化安裝、部署和升級,非常方便。因為使用了容器,所以可以很方便的把生產環境和開發環境分開,互不影響,這是docker最普遍的一個玩法。

Docker相關的核心技術之cgroups

Linux系統中經常有個需求就是希望能限制某個或者某些程序的分配資源。於是就出現了cgroups的概念,cgroup就是controller group ,在這個group中,有分配好的特定比例的cpu時間,IO時間,可用記憶體大小等。cgroups是將任意程序進行分組化管理的Linux核心功能。最初由google的工程師提出,後來被整合進Linux核心中。cgroups中的重要概念是“子系統”,也就是資源控制器,每種子系統就是一個資源的分配器,比如cpu子系統是控制cpu時間分配的。首先掛載子系統,然後才有control group的。比如先掛載memory子系統,然後在memory子系統中建立一個cgroup節點,在這個節點中,將需要控制的程序id寫入,並且將控制的屬性寫入,這就完成了記憶體的資源限制。cgroups被Linux核心支援,有得天獨厚的效能優勢,發展勢頭迅猛。在很多領域可以取代虛擬化技術分割資源。cgroup預設有諸多資源組,可以限制幾乎所有伺服器上的資源:cpumemiops,iobandwide,net,deviceacess等

Docker相關的核心技術之LXC

LXC是Linux containers的簡稱,是一種基於容器的作業系統層級的虛擬化技術。藉助於namespace的隔離機制和cgroup限額功能,LXC提供了一套統一的API和工具來建立和管理container。LXC跟其他作業系統層次的虛擬化技術相比,最大的優勢在於LXC被整合進核心,不用單獨為核心打補丁LXC 旨在提供一個共享kernel的OS 級虛擬化方法,在執行時不用重複載入Kernel, 且container的kernel與host共享,因此可以大大加快container的啟動過程,並顯著減少記憶體消耗,容器在提供隔離的同時,還通過共享這些資源節省開銷,這意味著容器比真正的虛擬化的開銷要小得多。在實際測試中,基於LXC的虛擬化方法的IO和CPU效能幾乎接近baremetal的效能。雖然容器所使用的這種型別的隔離總的來說非常強大,然而是不是像執行在hypervisor上的虛擬機器那麼強壯仍具有爭議性。如果核心停止,那麼所有的容器就會停止執行。•效能方面:LXC>>KVM>>XEN•記憶體利用率:LXC>>KVM>>XEN•隔離程度:XEN>>KVM>>LXC

Docker相關的核心技術之AUFS什麼是AUFS

AuFS是一個能透明覆蓋一或多個現有檔案系統的層狀檔案系統。支援將不同目錄掛載到同一個虛擬檔案系統下,可以把不同的目錄聯合在一起,組成一個單一的目錄。這種是一種虛擬的檔案系統,檔案系統不用格式化,直接掛載即可。Docker一直在用AuFS作為容器的檔案系統。當一個程序需要修改一個檔案時,AuFS建立該檔案的一個副本。AuFS可以把多層合併成檔案系統的單層表示。這個過程稱為寫入複製(copy on write )。AuFS允許Docker把某些映象作為容器的基礎。例如,你可能有一個可以作為很多不同容器的基礎的CentOS系統映象。多虧AuFS,只要一個CentOS映象的副本就夠了,這樣既節省了儲存和記憶體,也保證更快速的容器部署。使用AuFS的另一個好處是Docker的版本容器映象能力。每個新版本都是一個與之前版本的簡單差異改動,有效地保持映象檔案最小化。但,這也意味著你總是要有一個記錄該容器從一個版本到另一個版本改動的審計跟蹤。

Docker原理之App打包

LXC的基礎上, Docker額外提供的Feature包括:標準統一的打包部署執行方案為了最大化重用Image,加快執行速度,減少記憶體和磁碟footprint, Dockercontainer執行時所構造的執行環境,實際上是由具有依賴關係的多個Layer組成的。例如一個apache的執行環境可能是在基礎的rootfsimage的基礎上,疊加了包含例如Emacs等各種工具的image,再疊加包含apache及其相關依賴library的image,這些image由AUFS檔案系統載入合併到統一路徑中,以只讀的方式存在,最後再疊加載入一層可寫的空白的Layer用作記錄對當前執行環境所作的修改。有了層級化的Image做基礎,理想中,不同的APP就可以既可能的共用底層檔案系統,相關依賴工具等,同一個APP的不同例項也可以實現共用絕大多數資料,進而以copy on write的形式維護自己的那一份修改過的資料等
在這裡插入圖片描述

DockerImage

DockerImage是一個極度精簡版的Linux程式執行環境,比如vi這種基本的工具沒有,官網的Java映象包括的東西更少,除非是映象疊加方式的,如Centos+Java7
DockerImage是需要定製化Build的一個“安裝包”,包括基礎映象+應用的二進位制部署包
DockerImage內不建議有執行期需要修改的配置檔案•Dockerfile用來建立一個自定義
的image,包含了使用者指定的軟體依賴等。當前目錄下包含Dockerfile,使用命令build來建立新的image
DockerImage的最佳實踐之一是儘量重用和使用網上公開的基礎映象

DockerContainer

DockerContainer是Image的例項,共享核心
DockerContainer裡可以執行不同Os的Image,比如Ubuntu的或者Centos
DockerContainer不建議內部開啟一個SSHD服務,1.3版本後新增了dockerexec命令進入容器排查問題。
DockerContainer沒有IP地址,通常不會有服務埠暴露,是一個封閉的“盒子/沙箱

docker container生命週期

在這裡插入圖片描述

DockerDaemon

DockerDaemon是建立和執行Container的Linux守護程序,也是Docker最主要的核心元件
DockerDaemon 可以理解為DockerContainer的Container
DockerDaemon可以繫結本地埠並提供Rest API服務,用來遠端訪問和控制

stacks.DockerRegistry/Hub

Docker之所以這麼吸引人,除了它的新穎的技術外,圍繞官方Registry(DockerHub)的生態圈也是相當吸引人眼球的地方。在DockerHub上你可以很輕鬆下載到大量已經容器化好的應用映象,即拉即用。這些映象中,有些是Docker官方維護的,更多的是眾多開發者自發上傳分享的。而且你還可以在DockerHub中繫結你的程式碼託管系統(目前支援Github和Bitbucket)配置自動生成映象功能,這樣DockerHub會在你程式碼更新時自動生成對應的Docker映象。問題點:DockerHub是dotCloud公司私有的國內曾有公司試圖提供映象服務,但被禁止目前國內只有一個DaoCloud提供代理快取服務

注意點:

推到dockerhub 世界任何一個地方都能下載直接用,
image 安裝包 儘量重用基礎映象
containner是app 不報ip的 deamon 理解為tomcat jboss 遠端訪問 用來從registry拉取images
dockerhub 必須有一個自己的賬號