1. 程式人生 > >Docker 的應用場景在哪裡?

Docker 的應用場景在哪裡?

簡單說就是PaaS,可實現方便的服務建立、刪除,做到可伸縮,意義重大。可以快速構建一個容器,很快的構建一個 PaaS 容器,對不同的環境使用不同的 Docker 容器即可。

flynn和deis是基礎Docker實現的開源PaaS,相比CloudFoundry更小、更輕。

Docker依賴Linux LXC技術,輕量容器概念,其上實際執行的程式是在宿主機上的,本身不是完整的程式系統,也正是其特別之處。

---------------------------------------------------------

根據Docker佈道師Jerome Petazzoni的說法,Docker約等於LXC+AUFS(之前只支援ubuntu時)。其中LXC負責資源管理,AUFS負責映象管理;而LXC又包括cgroup、namespace、chroot等元件,並通過cgroup進行資源管理。所以只從資源管理這條線來看的話,Docker、LXC、CGroup三者的關係是:cgroup在最底層落實資源管理,LXC在cgroup上封裝了一層,Docker又在LXC封裝了一層。


Docker是Linux下應用容器引擎,提供一種比LXC高階的API。Docker使用Go語言開發,利用了Linux提供的LXC,AUFS,namespace和cgroup技術。實現了檔案系統,資源和網路的隔離,最終目標實現類似PaaS平臺的應用隔離。


LXC——Linux容器工具,容器有效地將由單個作業系統管理的資源劃分到孤立的組中,以更好地在孤立的組之間平衡有衝突的資源使用需求。與虛擬化相比,這樣既不需要指令級模擬,也不需要即時編譯。容器可以在核心 CPU 本地執行指令,而不需要任何專門的解釋機制。此外,也避免了準虛擬化(paravirtualization)和系統呼叫替換中的複雜性。

容器在提供隔離的同時,還通過共享這些資源節省開銷,這意味著容器比真正的虛擬化的開銷要小得多。


我們都知道Linux有一個程序號為1,名字為init的程序,系統服務的父程序都是init程序。

Docker容器中程序號為1的程序是bash,而不是init,一個執行的Linux竟然沒有init程序,簡直太不思議了。這其實得益於強大的Linux提供的LXC功能。宿主機器中執行的docker服務就是該容器中ubuntu系統的init程序。其實每個執行的容器僅僅是宿主機器中執行的一個程序而已,在容器中執行的任何程式其實也是執行在宿主機器中的一個程序。Docker通過cgroup將屬於每個容器的程序分為一組進行資源(記憶體,cpu,網路,硬碟)控制;通過namespace將屬於同一個容器的程序劃分為一組,使分屬於同一個容器的程序擁有獨立的程序名字和獨立分配的程序號,比如宿主機器存在一個程序號為1的程序,容器中也存在一個程序號為1的程序。


如果對同一臺服務上的少數應用需要控制資源的直接使用 cgroup 是較好的選擇,可以按使用者或使用者組控制系統資源。如果服務需要指出多種環境,那麼 Docker 就是最好的。


補充(20140625):

With the release of version 0.9 Docker.io have dropped LXC as the default execution environment, replacing it with their own libcontainer.

In other words, as of Docker 0.9, LXC is now optional.