1. 程式人生 > 遊戲 >地雷社《超次元遊戲海王星Sisters VS Sisters》預告 新情報公開

地雷社《超次元遊戲海王星Sisters VS Sisters》預告 新情報公開

Docker

介紹

Docker是PasS提供商DoctCloud開源的一個基於LXC的高階容器引擎,原始碼託管在Github上,基於go語言並遵從Apache2.0協議開源。Docker近期非常火熱,無論是從Github上的程式碼活躍度,還是Redhat在REHEL6.5中整合對Docker的支援,就連Google的Compute Engine也支援docker在意之上執行,百度、阿里、新浪、京東也開始使用Docker作為PaaS基礎。

某款開源軟體能否在商業上成功,很大程度上依賴三件事-成功的User case,活躍的社群和一個好故事。DotCloud在自家的PaaS產品上建立在docker之上,長期維護且有大量使用者,社群十分活躍,接下來我們看看docker 的故事。

  • ·環境管理複雜--從各種OS到各種中介軟體到各種app,一款產品能夠成功作為開發者需要關心的東西太多,且難於管理,這個問題幾乎在所有現代IT相關行業都需要面對,對此Docker可以簡化部署多種應用例項工作,比如Web應用、後臺應用、資料庫應用、大資料應用比如Hadoop叢集、訊息佇列等等都可以打包成一個 Image部署。

如圖所示:

  • 雲端計算時代的到來--AWS的成功,引導開發者將應用轉移到cloud上,解決了硬體管理的問題,然而中介軟體相關的問題依然存在,Docker的出現正好能幫助軟體開發者開闊思路,嘗試新的軟體管理方法來解決這個問題 ·虛擬化手段的變化--cloud時代採用標配硬體來降低成本,採用虛擬化手段來滿足使用者按需使用的需求以及保證可用性和隔離性,然而無論是kvm還是Xen在docker看來,都是在浪費資源,因為使用者需要的是高效執行環境而非OS,GuestOS既浪費資源又難於管理,更加輕量級的LXC更加靈活和快速。
  • LXC的移植性--LXC在linux2.6的kernel裡就已經存在了,但是其設計之初並非為雲端計算考慮的,缺少標準化的描述手段和容器的可遷移性,決定其構建出的環境難於遷移和標準化管理(相對於kvm之類的image和snapshot),Docker就在這個問題上作出實質性的革新。

面對上面的問題,docker設想是交付執行環境如同海運,OS如同一個貨輪,每一個在OS基礎上的軟體都如同一個集裝箱,使用者可以通過標準化手段自由組裝執行環境,同時集裝箱的內容可以由使用者自定義,也可以由專業人員製造。這樣,交付一個軟體,就是一系列標準化元件的集合的交付,如同樂高積木,使用者只需要選擇合適的積木組合,並且在最頂端署上自己的名字(最後標準化元件是使用者的app),這也就是基於docker的PaaS產品的原型。

在docker的網站上提到了docker的典型場景:

  • Automating the packaging and deployment of applications(使應用的打包與部署自動化)
  • Creation of lightweight, private PAAS environments(建立輕量、私密的PAAS環境)
  • Automated testing and continuous integration/deployment(實現自動化測試和持續的整合/部署)
  • Deploying and scaling web apps, databases and backend services(部署與擴充套件webapp、資料庫和後臺服務)

由於docker基於LXC輕量級的虛擬化特點(0.9之後不是基於LXC,但還是支援的),docker相比KVM之類最明顯的特點就是啟動快,資源佔用小。因此對於構建隔離性的標準化的執行環境,輕量級的PaaS(如dokku),構建自動化測試和持續整合環境,以及一切可以橫向擴充套件的應用(尤其是需要快速啟停來應對峰谷的web應用)。

(1)構建標準化的執行環境,現有方案大多是在一個base OS上執行的一套puppet/chef,或者一個image檔案,期缺點是前者需要base OS許多前提條件,後者幾乎不可以修改(因為copy on write的檔案格式在執行時rootfs是read only),並且後者檔案體積大,環境管理和版本控制本身也是一個問題。

(2)PaaS環境是不言而喻的,其設計之初和DotCloud的案例都是將其作為PaaS產品的環境基礎

(3)因為其標準化構建方法(buildfile)和良好的REST API,自動化測試和持續整合/部署能夠很好的整合進來

(4)由於LXC輕量級的特點,其啟動快,而且docker能夠只加載每個container變化的部分,這樣的資源佔用小,能夠在單機環境下與KVM之類的虛擬化方案相比能夠更加快速和佔用更少資源

原理

Docker核心解決的問題是利用LXC來實現類似VM的功能,從而利用更加節省的硬體資源提供給使用者更多的計算資源。同VM的方式不同, LXC其並不是一套硬體虛擬化方法 - 無法歸屬到全虛擬化、部分虛擬化和半虛擬化中的任意一個,而是一個作業系統級虛擬化方法, 理解起來可能並不像VM那樣直觀。所以我們從虛擬化到docker要解決的問題出發,看看他是怎麼滿足使用者虛擬化需求的。

使用者需要考慮虛擬化方法,尤其是硬體虛擬化方法,需要藉助其解決的主要是以下4個問題:

  • 隔離性 - 每個使用者例項之間相互隔離, 互不影響。 硬體虛擬化方法給出的方法是VM, LXC給出的方法是container,更細一點是kernel namespace
  • 可配額/可度量 - 每個使用者例項可以按需提供其計算資源,所使用的資源可以被計量。硬體虛擬化方法因為虛擬了CPU, memory可以方便實現, LXC則主要是利用cgroups來控制資源
  • 移動性 - 使用者的例項可以很方便地複製、移動和重建。硬體虛擬化方法提供snapshot和image來實現,docker(主要)利用AUFS實現 emory可以方便實現, LXC則主要是利用cgroups來控制資源
  • 移動性 - 使用者的例項可以很方便地複製、移動和重建。硬體虛擬化方法提供snapshot和image來實現,docker(主要)利用AUFS實現
  • 安全性 - 這個話題比較大,這裡強調是host主機的角度儘量保護container。硬體虛擬化的方法因為虛擬化的水平比較高,使用者程序都是在KVM等虛擬機器容器中翻譯執行的, 然而對於LXC, 使用者的程序是lxc-start程序的子程序, 只是在Kernel的namespace中隔離的, 因此需要一些kernel的patch來保證使用者的執行環境不會受到來自host主機的惡意入侵, dotcloud(主要是)利用kernel grsec patch解決的.

侷限

Docker並不是全能的,設計之初也不是KVM之類虛擬化手段的替代品,簡單總結幾點:

  • Docker是基於Linux 64bit的,無法在32bit的linux/Windows/unix環境下使用
  • LXC是基於cgroup等linux kernel功能的,因此container的guest系統只能是linux base的
  • 隔離性相比KVM之類的虛擬化方案還是有些欠缺,所有container公用一部分的執行庫
  • 網路管理相對簡單,主要是基於namespace隔離
  • cgroup的cpu和cpuset提供的cpu功能相比KVM的等虛擬化方案相比難以度量(所以dotcloud主要是按記憶體收費)
  • Docker對disk的管理比較有限
  • container隨著使用者程序的停止而銷燬,container中的log等使用者資料不便收集