天天看點

Docker是個啥?

     談到docker大家應該都不陌生,從2013年初誕生到現在,短短兩年時間内,迅速成為僅次于openstack的最受歡迎的雲計算開源項目。

       那麼是什麼原因導緻docker這麼火熱呢?

       我也很感興趣,是以我将用docker實踐這一系列博文,記錄我對docker的認識和實踐。

       本文主要介紹docker是什麼,以及docker與傳統虛拟化之間的差別等。

docker是什麼?

       docker,它是一個基于LXC(LinuX Container)的進階容器引擎,使用Go語言開發,遵循Apache2.0協定,全部開源代碼均托管在github上(https://github.com/docker/docker)。它誕生于2013年初,最初發起者是dotCloud公司,該公司現已經改名為Docker Inc,專注于Docker相關技術和産品的開發。

       目前,主流的linux、windows和mac都已經支援docker。需要注意的是,由于docker是基于LXC的,是以除了linux之外的作業系統,都是靠在虛拟機裡面跑linux,再在linux上跑docker來實作的。

       docker誕生的主要目标是"Build,Ship and Run Any App,Anywhere",即通過對應用元件的封裝(Packaging)、分發(Deployment)、部署(Deployment)、運作(Runtime)等生命周期的管理,達到應用元件級别的"一次封裝,到處運作"。這裡的應用元件,既可以是一個web應用,也可以是一套資料庫服務,甚至是一個作業系統或者編譯器。

LXC是什麼?

       docker引擎的基礎是Linux容器(linux container,LXC)技術。IBM DevelperWorks上給出了關于容器技術的準确描述:

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

       liunux容器并不是一個全新的概念,早期的容器技術有chroot、Solaris Containers、FreeBSD jail、linux-VServer、Solaris Zones、OpenVZ、lxc等。雖然這些技術發展很早,但是并沒有內建到linux核心中去,使用起來很不友善,比如OpenVZ需要先給作業系統打上特定的内盒更新檔才能使用。LXC項目借鑒了前人成熟的容器設計理念,并給予一系列新的核心特性實作了更具擴充性的虛拟化容器方案,并且被內建到了主流linux核心中,進而成為linux系統輕量級容器技術的事實标準。

       在LXC的基礎上,docker做了很大的改善,比如:

1、LXC的定位是作為一種虛拟機的替代方案。雖然所有的軟體都可以安裝在由 LXC 或者 Docker 管理的容器中,但是 Docker 更傾向于在一個容器中運作一個應用

2、每個LXC容器之間或許不相容,但是 docker 采用了一種标準的配置方法使得由不同docker建立出的LXC能夠完全相容

3、Docker實作了類似 git 的容器版本管理方法,并且能夠進行增量更新。

4、可以建立 base image 并将其儲存在遠端倉庫 (repository) 中以便複用,其他容器可以在其基礎上進行建立并儲存為新的image。

5、docker提供了各種容器管理工具(如分發、版本、移植等)讓使用者無需關注底層的操作,可以簡單明了地管理和使用容器

6、Docker管理着一個公共的 image 庫友善使用者分享自己的image,同時公司也可以構造自己私有的 image 庫。

7、Docker的容器是根據 Dockerfile 建構的,你可以在建構 image 的過程中,根據需要運作任何指令和程式。

8、因為 docker 越來越流行,有大量的方法能夠将其輕易地內建到開發過程中,比如可以采用統一的方法來構造用于持續內建的環境和開發環境的容器。

Docker與虛拟機的差別

       其實,docker和虛拟機都是屬于虛拟化技術。而虛拟化技術又分了很多種類。比如VM、KVM這種全虛拟化和早期的Xen這種半虛拟化。而docker則是屬于作業系統級虛拟化。

       像VM、KVM之類的虛拟出來的都是虛拟機,而docker作為一種輕量級的虛拟化方式,那麼docker在運作應用上跟傳統的虛拟機方式有哪些顯著優勢呢?

1、docker容器很快,啟動和停止可以在秒級實作,這相比傳統的虛拟機方式要快的很多

2、docker容器對系統資源需求很少,一台主機上可以同時運作數千個docker容器

3、docker通過類似git的操作來友善使用者擷取、分發和更新應用鏡像,指令簡明,學習成本很低

4、docker通過dockerfile配置檔案來支援靈活的自動化建立和部署機制,提高工作效率

下面是docker容器技術和傳統虛拟機技術的特性比較:

特性

容器

虛拟機

啟動速度

秒級

分鐘級

硬碟使用

一般為MB

一般為GB

性能

接近原生

弱于

系統支援量

單機支援上千個容器

一般幾十個

隔離性

安全隔離

       docker的這些優勢是什麼造成的呢?我們可以先看下圖:

<a href="http://s3.51cto.com/wyfs02/M00/6C/A1/wKiom1VONxiTVjjmAAF7viqcvXA143.jpg" target="_blank"></a>

       傳統虛拟化是在硬體層面實作虛拟化,需要有額外的虛拟機管理應用和虛拟機作業系統層,而docker容器卻不需要這兩層,而是直接使用作業系統的系統調用接口。正因為這樣子,docker容器除了運作其中的應用之外,基本不消耗額外的系統資源,保證應用性能的同時,盡量減小系統開銷。傳統虛拟機方式,運作N個不同的應用就要啟動N個虛拟機(每個虛拟機需要單獨配置設定記憶體、磁盤等資源),而docker隻需要啟動N個隔離的容器,并将應用放到容器中即可,這樣子就減少了很多的資源消耗。

docker在軟體開發流程中的優勢

       docker在設計之初就有以下幾個目的:

1、加強開發人員寫代碼的開發環境和應用程式要部署的生産環境的一緻性,進而降低那種"開發一切正常,肯定是運維的問題"的風險。

2、縮短代碼從開發、測試到部署、上線運作的周期,讓你的程式具備可以執行,易于建構、并易于協作

3、docker鼓勵面向服務的架構和微服務架構。docker推薦單個容器運作一個應用程式或程序,這樣就形成了一個分布式的應用程式模型

       使用docker,開發人員隻需要關心容器中運作的應用程式,而運維人員隻需要關心如何管理容器。

       總體來講,docker在開發和運維過程中,具有如下優勢:

1、更快速的傳遞和部署

2、更高效的資源利用。docker容器的運作不需要額外的虛拟機管理程式(VMM,以及Hypervisor)支援,它是核心級的虛拟化,可以實作更高的性能,同時對資源的需求很低

3、更輕松的遷移和擴充

4、更簡單的更新管理。使用dockerfile,隻需要小小的配置修改,就可以替代以往大量的更新工作,并且所有修改都以增量的方式進行分發和更新,進而實作自動化并且高效的容器管理。

OK!

以上即是本文的全部内容,有關docker的其它内容,會在下篇博文出現。

本文轉自 aaao 51CTO部落格,原文連結:http://blog.51cto.com/nolinux/1649923,如需轉載請自行聯系原作者