什麼是Docker?

Docker是一個開源的引擎,能夠輕鬆的爲任何應用建立一個輕量級的、可移植的、自給自足的容器。開發者在筆記本上編譯測試經過的容器能夠批量地在生產環境中部署,包括VMs(虛擬機)、bare metal、OpenStack 集羣和其餘的基礎應用平臺。 git

Docker一般用於以下場景:

  • web應用的自動化打包和發佈;
  • 自動化測試和持續集成、發佈;
  • 在服務型環境中部署和調整數據庫或其餘的後臺應用;
  • 從頭編譯或者擴展示有的OpenShift或Cloud Foundry平臺來搭建本身的PaaS環境。

 

簡單得來講,Docker是一個由GO語言寫的程序運行的「容器」(Linux containers, LXCs); 目前雲服務的基石是操做系統級別的隔離,在同一臺物理服務器上虛擬出多個主機。Docker則實現了一種應用程序級別的隔離; 它改變咱們基本的開發、操做單元,由直接操做虛擬主機(VM),轉換到操做程序運行的「容器」上來。web

 

Docker是爲開發者和系統管理員設計的,用來發布和運行分佈式應用程序的一個開放性平臺。由兩部分組成:docker

  • Docker Engine: 一個便攜式、輕量級的運行環境和包管理器。(注* 單OS vs 單線程,是否是跟NodeJS特別像?)
  • Docker Hub: 爲建立自動化工做流和分享應用建立的雲服務組成。(注* 雲端鏡像/包管理 vs npm包管理,是否是跟npm特別像?)

 

Docker 擴展了 Linux 容器(Linux Containers),或着說 LXC,經過一個高層次的 API 爲進程單獨提供了一個輕量級的虛擬環境。Docker 利用了 LXC, cgroups 和 Linux 本身的內核。和傳統的虛擬機不一樣的是,一個 Docker 容器並不包含一個單獨的操做系統,而是基於已有的基礎設施中操做系統提供的功能來運行的。這裏有一個 Stackoverflow 的答案,裏面很是詳細清晰地描述了全部 Docker 不一樣於純粹的 LXC 的功能特性數據庫

Docker 會像一個可移植的容器引擎那樣工做。它把應用程序及全部程序的依賴環境打包到一個虛擬容器中,這個虛擬容器能夠運行在任何一種 Linux 服務器上。這大大地提升了程序運行的靈活性和可移植性,不管需不須要許可、是在公共雲仍是私密雲、是否是裸機環境等等。npm

Docker 由下面這些組成:
1. Docker 服務器守護程序(server daemon),用於管理全部的容器。
2. Docker 命令行客戶端,用於控制服務器守護程序。
3. Docker 鏡像:查找和瀏覽 docker 容器鏡像。它也訪問這裏獲得:https://index.docker.io/服務器

Docker相對於VM虛擬機的優點十分明顯,那就是輕量和高性能和便捷性, 如下部分摘自: KVM and Docker LXC Benchmarking with OpenStack框架

 

優勢:分佈式

性能

  運行時的性能能夠獲取極大提高(經典的案例是提高97%)測試

  管理操做(啓動,中止,開始,重啓等等) 都是以秒或毫秒爲單位的。

 

敏捷

  像虛擬機同樣敏捷,並且會更便宜,在bare metal(裸機)上佈署像點個按鈕同樣簡單。

 

靈活

  將應用和系統「容器化」,不添加額外的操做系統,

 

輕量

  你會擁有足夠的「操做系統」,僅需添加或減少鏡像便可。在一臺服務器上能夠佈署100~1000個Containers容器。

 

便宜

  開源的,免費的,低成本的。由現代Linux內核支持並驅動。注* 輕量的Container一定能夠在一個物理機上開啓更多「容器」,註定比VMs要便宜。

 

生態系統

  正在愈來愈受歡迎,只須要看一看Google的趨勢就知道了, docker or LXC.

  還有不可勝數的社區和第三方應用。

 

雲支持

  不可勝數的雲服務提供建立和管理Linux容器框架。

  有關Docker性能方面的優點,還可參考此IBM工程師對性能提高的評測,從各個方面比VMs(OS系統級別虛擬化)都有很是大的提高。

  Performance Characteristics of VMs vs Docker Containers by Boden Russel (IBM)

  Performance characteristics of traditional v ms vs docker containers

 

有爭論的部分

  任何項目都會有爭論,就像Go,像NodeJS, 一樣Docker也有一些。

 

可否完全隔離

  在超複雜的業務系統中,單OS到底能不能實現完全隔離,一個程序的崩潰/內存溢出/高CPU佔用到底會不會影響到其餘容器或者整個系統?不少人對Docker可否在實際的多主機的生產環境中支持關鍵任務系統還有所懷疑。 注* 就像有人質疑Node.JS單線程快而不穩,沒法在複雜場景中應用同樣。

  不過可喜的是,目前Linux內核已經針對Container作了不少改進,以支持更好的隔離。

 

GO語言尚未徹底成熟

  Docker由Go語言開發,但GO語言對大多數開發者來講比較陌生,並且還在不斷改進,距離成熟還有一段時間。此半git、半包管理的方式讓一些人產生不適。

相關文章
相關標籤/搜索