Docker的思想來自於集裝箱
。
集裝箱解決了什麼問題?在一艘大船上,能夠把貨物規整的擺放起來。而且各類各樣的貨物被集裝箱標準化了,集裝箱和集裝箱之間不會互相影響。那麼我就不須要專門運送水果的船和專門運送化學品的船了。只要這些貨物在集裝箱裏封裝的好好的,那我就能夠用一艘大船把他們都運走。
但是這個箱子爲何這麼神奇呢?無非就是兩個字:標準。git
是的!標準!標準!標準!web
按照這個思路,docker 其實跟集裝箱同樣,或者說它想跟集裝箱同樣,成爲「標準化」。
這就是 docker 的實質:標準化。sql
Docker帶來了哪些好處docker
粗略來講,Docker好處有:數據庫
1.保證了線上線下環境的一致性
。咱們在線下的開發環境使用Docker構建好weaapp的鏡像後,能夠直接在線上使用一個鏡像,保證了線上線下環境的一致性,不再會有在線下開發環境中運行正常,而部署到線上各類錯誤了。編程
2.極大的簡化了webapp的部署流程
。在不使用Docker時,咱們部署app時,要先搭建好app運行所需環境,這個過程作過的人都知道多麼枯燥繁瑣,一不當心還出錯。而有了Docker,咱們只須要直接構建一個咱們webapp的鏡像而後將其運行便可,不管在多少臺服務器中部署,都是如此。再好比,使用Docker以前要搭建一個WordPress對於新手來講是有些困難的,而有了Docker,只須要從DockerHub上pull一個WordPress鏡像並啓動就能夠了,很是很是方便。ubuntu
3.實現了沙盒機制,提升了安全性
。因爲webapp運行在容器中,與操做系統隔離開了,從而使操做系統基本不可能受到破壞,另外若是webapp由於攻擊而癱瘓,並不須要重啓服務器,直接重啓容器或者再啓動一個鏡像就能夠了。segmentfault
4.實現了模塊化,提升了複用性
。在二中使用Docker的第二種方式就能夠看出,咱們將數據庫和Tomcat運行在不一樣的容器中,從某種角度來講,這也下降了模塊之間的耦合性,便於拓展。好比咱們要把MySQL替換爲oracle,只須要再構建一個oracle鏡像並啓動與Tomcat鏈接便可,很是方便。對於咱們構建的鏡像,在其餘app中直接拿來用就能夠了,沒必要重複勞動。api
設想一個以下場景:安全
咱們須要一個webapp,其功能是用戶註冊並將註冊信息插入到數據庫,環境爲Ubuntu+Tomcat+Mysql,怎麼作?不使用Docker的話,咱們一般會這樣作,以Ubuntu爲操做系統,而後安裝Tomcat和MySQL,最後把app部署上就能夠了。那麼使用Docker會怎麼作呢,在這個場景下,能夠有兩種方式:1.仍然以Ubuntu爲操做系統,而後構建一個安裝有MySQL和Tomcat的Docker鏡像,並把app部署到其中,最後啓動Docker鏡像就能夠了。看起來好像和不使用Docker基本相同,甚至還要麻煩一些,是這樣嗎?彆着急,繼續往下看。2.第二種方式則體現了Docker的"每一個容器只作一件事情"的思想,咱們構建兩個鏡像,一個僅安裝Tomcat並部署咱們的app,另外一個僅安裝MySQL,而後啓動這兩個鏡像,獲得兩個容器,再利用Docker的容器互聯技術將兩者鏈接(Docker的容器是經過http鏈接的)。
5.實現了虛擬化,提升硬件利用率
。有了Docker,咱們能夠在一臺服務器上運行不少webapp,充分利用閒置資源。這時候,服務器的操做系統就相似於貨輪,而一個個Docker容器就至關於貨輪上的一個個集裝箱。如今大熱的雲服務市場,很多就用了Docker。舉個例子來講,如今咱們有一臺操做系統爲Ubuntu14.04的服務器,咱們構建不一樣版本的ubuntu鏡像並啓動,而且爲不一樣的用戶分配不一樣的容器。這樣,用一臺服務器能夠虛擬出n個運行着不一樣操做系統的虛擬服務器,而對於用戶來講,這些是透明的––用戶則認爲本身擁有一臺完整的服務器。據我推測,阿里雲的服務器就是這麼幹的。這充分利用了閒置的硬件資源。
總結:
Docker背後的想法是建立軟件程序可移植的輕量級容器,讓其能夠在任何安裝了Docker的機器上運行,並不用關心底層操做系統,就像野心勃勃的造船者們成功建立了集裝箱而不須要考慮裝在哪一種船舶上同樣。
只有一個共同目標:簡化部署流程,提升生產力!
Docker基於LXC(Linux容器),在LXC的基礎上進一步封裝,使得操做更簡單,就像操做一個輕量級的虛擬機同樣。
先上圖,vm與docker框架,直觀上來說vm多了一層guest OS,同時Hypervisor會對硬件資源進行虛擬化,docker直接使用硬件資源,因此資源利用率相對docker低也是比較容易理解的
一個IBM測試案例,關於計算能力的,對於kvm爲何會有這麼大的性能損失,一方面是由於虛擬機增長了一層虛擬硬件層,運行在虛擬機上的應用程序在進行數值計算時是運行在Hypervisor虛擬的CPU上的;另一方面是因爲計算程序自己的特性致使的差別。虛擬機虛擬的cpu架構不一樣於實際cpu架構,數值計算程序通常針對特定的cpu架構有必定的優化措施,虛擬化使這些措施做廢,甚至起到反效果。
總結:
集裝箱:程序部署,保證運行環境不會出錯。
標準化:
(1)運輸方式:QQ/郵件==>>從倉庫(hub.docker.com)獲取。
(2)存儲方式:應用程序。
(3)API接口:REST api接口,統一控制全部應用。
隔離:Linux內核限制機制LXC。LXC是一種內核虛擬化技術,能夠提供輕量級的虛擬化,以便隔離進程和資源。
Docker使用C/S
架構,經過docker客戶端鏈接到Docker服務器上從而管理Docker服務器裏面的鏡像和容器,相似於git的架構。
三個Docker基本概念
Image(鏡像):相似於模板,包含軟件運行環境和代碼。
例如包含完整的CentOS系統,並安裝了JRE。鏡像用於建立Docker容器,鏡像自己是只讀
的。
Container(容器):Docker利用容器來運行應用,容器是從鏡像建立的運行實例。它能夠被啓動、中止、刪除,每一個容器相互隔離。
Repository(倉庫): 幾種存放Docker鏡像的場所。最大的倉庫未Dockey Hub,國內網易蜂巢:https://c.163.com等。一個倉庫包含多個鏡像。倉庫能夠分爲私有和共有。私有的倉庫能夠push和pull。倉庫註冊服務器(Registry)每每包含多個倉庫。
Build-構建鏡像 - 集裝箱 - 鏡像
Ship-運輸鏡像(從倉庫和咱們的主機上運輸)- 碼頭 - 倉庫
Run- 運行鏡像(運行的鏡像就是一個容器,能夠當成一個「虛擬機」
) - 運行程序的地方 - 容器
docker鏡像文件都是隻讀的,只有最上層是能夠寫
容器的本質是一個進程。
Docker系統有兩個程序:docker服務端和docker客戶端。其中docker服務端是一個服務進程,管理着全部的容器。docker客戶端則扮演着docker服務端的遠程控制器,能夠用來控制docker的服務端進程。大部分狀況下,docker服務端和客戶端運行在一臺機器上。
檢查docker的版本,這樣能夠用來確認docker服務在運行並可經過客戶端連接。
$docker version
鑑於國內網絡問題,後續拉取 Docker 鏡像十分緩慢,強烈建議安裝 Docker 以後配置 國內鏡像加速。
1.進入http://dev.aliyun.com
2.登陸阿里雲進入後臺
點擊 Apply&Restart 後 Docker 就會重啓並應用配置的鏡像地址了
配置加速器以後,若是拉取鏡像仍然十分緩慢,請手動檢查加速器配置是否生效,在命令行執行 docker info
,若是從結果中看到了以下內容,說明配置成功。