談到docker你們應該都不陌生,從2013年初誕生到如今,短短兩年時間內,迅速成爲僅次於openstack的最受歡迎的雲計算開源項目。linux
那麼是什麼緣由致使docker這麼火熱呢?git
我也很感興趣,所以我將用docker實踐這一系列博文,記錄我對docker的認識和實踐。github
本文主要介紹docker是什麼,以及docker與傳統虛擬化之間的區別等。web
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來實現的。windows
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作了很大的改善,好比:
一、LXC的定位是做爲一種虛擬機的替代方案。雖然全部的軟件均可以安裝在由 LXC 或者 Docker 管理的容器中,可是 Docker 更傾向於在一個容器中運行一個應用
二、每一個LXC容器之間或許不兼容,可是 docker 採用了一種標準的配置方法使得由不一樣docker建立出的LXC可以徹底兼容
三、Docker實現了相似 git 的容器版本管理方法,而且可以進行增量更新。
四、能夠建立 base p_w_picpath 並將其保存在遠程倉庫 (repository) 中以便複用,其餘容器能夠在其基礎上進行建立並保存爲新的p_w_picpath。
五、docker提供了各類容器管理工具(如分發、版本、移植等)讓用戶無需關注底層的操做,能夠簡單明瞭地管理和使用容器
六、Docker管理着一個公共的 p_w_picpath 庫方便用戶分享本身的p_w_picpath,同時公司也能夠構造本身私有的 p_w_picpath 庫。
七、Docker的容器是根據 Dockerfile 構建的,你能夠在構建 p_w_picpath 的過程當中,根據須要運行任何命令和程序。
八、由於 docker 愈來愈流行,有大量的方法可以將其輕易地集成到開發過程當中,好比能夠採用統一的方法來構造用於持續集成的環境和開發環境的容器。
Docker與虛擬機的區別
其實,docker和虛擬機都是屬於虛擬化技術。而虛擬化技術又分了不少種類。好比VM、KVM這種全虛擬化和早期的Xen這種半虛擬化。而docker則是屬於操做系統級虛擬化。
像VM、KVM之類的虛擬出來的都是虛擬機,而docker做爲一種輕量級的虛擬化方式,那麼docker在運行應用上跟傳統的虛擬機方式有哪些顯著優點呢?
一、docker容器很快,啓動和中止能夠在秒級實現,這相比傳統的虛擬機方式要快的不少
二、docker容器對系統資源需求不多,一臺主機上能夠同時運行數千個docker容器
三、docker經過相似git的操做來方便用戶獲取、分發和更新應用鏡像,指令簡明,學習成本很低
四、docker經過dockerfile配置文件來支持靈活的自動化建立和部署機制,提升工做效率
下面是docker容器技術和傳統虛擬機技術的特性比較:
特性 | 容器 | 虛擬機 |
啓動速度 | 秒級 | 分鐘級 |
硬盤使用 | 通常爲MB | 通常爲GB |
性能 | 接近原生 | 弱於 |
系統支持量 | 單機支持上千個容器 | 通常幾十個 |
隔離性 | 安全隔離 | 安全隔離 |
docker的這些優點是什麼形成的呢?咱們能夠先看下圖:
傳統虛擬化是在硬件層面實現虛擬化,須要有額外的虛擬機管理應用和虛擬機操做系統層,而docker容器卻不須要這兩層,而是直接使用操做系統的系統調用接口。正由於這樣子,docker容器除了運行其中的應用以外,基本不消耗額外的系統資源,保證應用性能的同時,儘可能減少系統開銷。傳統虛擬機方式,運行N個不一樣的應用就要啓動N個虛擬機(每一個虛擬機須要單獨分配內存、磁盤等資源),而docker只須要啓動N個隔離的容器,並將應用放到容器中便可,這樣子就減小了不少的資源消耗。
docker在軟件開發流程中的優點
docker在設計之初就有如下幾個目的:
一、增強開發人員寫代碼的開發環境和應用程序要部署的生產環境的一致性,從而下降那種"開發一切正常,確定是運維的問題"的風險。
二、縮短代碼從開發、測試到部署、上線運行的週期,讓你的程序具有能夠執行,易於構建、並易於協做
三、docker鼓勵面向服務的架構和微服務架構。docker推薦單個容器運行一個應用程序或進程,這樣就造成了一個分佈式的應用程序模型
使用docker,開發人員只須要關心容器中運行的應用程序,而運維人員只須要關心如何管理容器。
整體來說,docker在開發和運維過程當中,具備以下優點:
一、更快速的交付和部署
二、更高效的資源利用。docker容器的運行不須要額外的虛擬機管理程序(VMM,以及Hypervisor)支持,它是內核級的虛擬化,能夠實現更高的性能,同時對資源的需求很低
三、更輕鬆的遷移和擴展
四、更簡單的更新管理。使用dockerfile,只須要小小的配置修改,就能夠替代以往大量的更新工做,而且全部修改都以增量的方式進行分發和更新,從而實現自動化而且高效的容器管理。
OK!
以上便是本文的所有內容,有關docker的其它內容,會在下篇博文出現。