Docker介紹基本概念(一)

Docker介紹基本概念

1.什麼是Docker?

說實話關於Docker是什麼並太好說,下面我經過四點向你說明Docker究竟是個什麼東西。前端

  • Docker是世界領先的軟件容器平臺。docker

  • Docker使用Google公司推出的Go語言進行開發實現,基於Linux內核的cgroup,namespace,以及AUFS類的UnionFS等技術,對進程進行封裝隔離,屬於操做系統層面的虛擬化技術。 因爲隔離的進程獨立於宿主和其它的隔離的進程,所以也稱其爲容器。Docke最初實現是基於LXC。數據庫

  • Docker可以自動執行重複性任務,例如搭建和配置開發環境,從而解放了開發人員以便他們專一在真正重要的事情上:構建傑出的軟件。後端

  • 用戶能夠方便地建立和使用容器,把本身的應用放入容器。容器還能夠進行版本管理、複製、分享、修改,就像管理普通的代碼同樣。安全

2.Docker思想

  • 集裝箱服務器

  • 標準化: ①運輸方式、②存儲方式、 ③API接口網絡

  • 隔離架構

3.Docker容器的特色

  • 輕量,在一臺機器上運行的多個Docker容器能夠共享這臺機器的操做系統內核;它們可以迅速啓動,只需佔用不多的計算和內存資源。鏡像是經過文件系統層進行構造的,並共享一些公共文件。這樣就能儘可能下降磁盤用量,並能更快地下載鏡像。性能

  • 標準,Docker容器基於開放式標準,可以在全部主流Linux版本、Microsoft Windows以及包括VM、裸機服務器和雲在內的任何基礎設施上運行。測試

  • 安全,Docker賦予應用的隔離性不只限於彼此隔離,還獨立於底層的基礎設施。Docker默認提供最強的隔離,所以應用出現問題,也只是單個容器的問題,而不會波及到整臺機器。

4.爲何要用Docker

  • Docker的鏡像提供了除內核外完整的運行時環境,確保了應用運行環境一致性,從而不會再出現「這段代碼在我機器上沒問題啊」這類問題;——一致的運行環境

  • 能夠作到秒級、甚至毫秒級的啓動時間。大大的節約了開發、測試、部署的時間。——更快速的啓動時間

  • 避免公用的服務器,資源會容易受到其餘用戶的影響。——隔離性

  • 善於處理集中爆發的服務器使用壓力;——彈性伸縮,快速擴展

  • 能夠很輕易的將在一個平臺上運行的應用,遷移到另外一個平臺上,而不用擔憂運行環境的變化致使應用沒法正常運行的狀況。——遷移方便

  • 使用Docker能夠經過定製應用鏡像來實現持續集成、持續交付、部署。——持續交付和部署

容器 VS 虛擬機

簡單來講: 容器和虛擬機具備類似的資源隔離和分配優點,但功能有所不一樣,由於容器虛擬化的是操做系統,而不是硬件,所以容器更容易移植,效率也更高。

二者對比圖

傳統虛擬機技術是虛擬出一套硬件後,在其上運行一個完整操做系統,在該系統上再運行所需應用進程;而容器內的應用進程直接運行於宿主的內核,容器內沒有本身的內核,並且也沒有進行硬件虛擬。所以容器要比傳統虛擬機更爲輕便。

容器與虛擬機 (VM) 總結

  • 容器是一個應用層抽象,用於將代碼和依賴資源打包在一塊兒。 多個容器能夠在同一臺機器上運行,共享操做系統內核,但各自做爲獨立的進程在用戶空間中運行 。與虛擬機相比, 容器佔用的空間較少(容器鏡像大小一般只有幾十兆),瞬間就能完成啓動 。

  • 虛擬機(VM)是一個物理硬件層抽象,用於將一臺服務器變成多臺服務器。 管理程序容許多個VM在一臺機器上運行。每一個VM都包含一整套操做系統、一個或多個應用、必要的二進制文件和庫資源,所以佔用大量空間。並且VM啓動也十分緩慢 。

經過Docker官網,咱們知道了這麼多Docker的優點,可是你們也沒有必要徹底否認虛擬機技術,由於二者有不一樣的使用場景。虛擬機更擅長於完全隔離整個運行環境。例如,雲服務提供商一般採用虛擬機技術隔離不一樣的用戶。而Docker一般用於隔離不一樣的應用 ,例如前端,後端以及數據庫。

容器與虛擬機(VM)二者是能夠共存的

就我而言,對於二者無所謂誰會取代誰,而是二者能夠和諧共存。

Docker中很是重要的三個基本概念,理解了這三個概念,就理解了 Docker 的整個生命週期。

Docker基本概念

Docker包括三個基本概念:

  • 鏡像(Image)

  • 容器(Container)

  • 倉庫(Repository)

鏡像(Image)——一個特殊的文件系統

操做系統分爲內核和用戶空間。對於Linux而言,內核啓動後,會掛載root文件系統爲其提供用戶空間支持。而Docker鏡像(Image),就至關因而一個root文件系統。

Docker鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。 鏡像不包含任何動態數據,其內容在構建以後也不會被改變。

Docker設計時,就充分利用Union FS的技術,將其設計爲分層存儲的架構。 鏡像實際是由多層文件系統聯合組成。

鏡像構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在本身這一層。好比,刪除前一層文件的操做,實際不是真的刪除前一層的文件,而是僅在當前層標記爲該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,可是實際上該文件會一直跟隨鏡像。所以,在構建鏡像的時候,須要額外當心,每一層儘可能只包含該層須要添加的東西,任何額外的東西應該在該層構建結束前清理掉。

分層存儲的特徵還使得鏡像的複用、定製變的更爲容易。甚至能夠用以前構建好的鏡像做爲基礎層,而後進一步添加新的層,以定製本身所需的內容,構建新的鏡像。

容器(Container)——鏡像運行時的實體

鏡像(Image)和容器(Container)的關係,就像是面向對象程序設計中的類和實例同樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器能夠被建立、啓動、中止、刪除、暫停等 。

容器的實質是進程,但與直接在宿主執行的進程不一樣,容器進程運行於屬於本身的獨立的命名空間。前面講過鏡像使用的是分層存儲,容器也是如此。

容器存儲層的生存週期和容器同樣,容器消亡時,容器存儲層也隨之消亡。所以,任何保存於容器存儲層的信息都會隨容器刪除而丟失。

按照Docker最佳實踐的要求,容器不該該向其存儲層內寫入任何數據 ,容器存儲層要保持無狀態化。全部的文件寫入操做,都應該使用數據卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。數據卷的生存週期獨立於容器,容器消亡,數據卷不會消亡。所以, 使用數據卷後,容器能夠隨意刪除、從新run,數據卻不會丟失。

倉庫(Repository)——集中存放鏡像文件的地方

鏡像構建完成後,能夠很容易的在當前宿主上運行,可是, 若是須要在其它服務器上使用這個鏡像,咱們就須要一個集中的存儲、分發鏡像的服務,Docker Registry就是這樣的服務。

一個Docker Registry中能夠包含多個倉庫(Repository);每一個倉庫能夠包含多個標籤(Tag);每一個標籤對應一個鏡像。因此說:鏡像倉庫是Docker用來集中存放鏡像文件的地方相似於咱們以前經常使用的代碼倉庫。

一般,一個倉庫會包含同一個軟件不一樣版本的鏡像,而標籤就經常使用於對應該軟件的各個版本 。咱們能夠經過<倉庫名>:<標籤>的格式來指定具體是這個軟件哪一個版本的鏡像。若是不給出標籤,將以latest做爲默認標籤。

這裏補充一下Docker Registry公開服務和私有Docker Registry的概念:

Docker Registry公開服務是開放給用戶使用、容許用戶管理鏡像的Registry服務。通常這類公開服務容許用戶免費上傳、下載公開的鏡像,並可能提供收費服務供用戶管理私有鏡像。

最常使用的Registry公開服務是官方的Docker Hub ,這也是默認的Registry,並擁有大量的高質量的官方鏡像,網址爲:hub.docker.com/ 。在國內訪問Docker Hub可能會比較慢國內也有一些雲服務商提供相似於Docker Hub的公開服務。

除了使用公開服務外,用戶還能夠在本地搭建私有Docker Registry 。Docker官方提供了Docker Registry鏡像,能夠直接使用作爲私有Registry服務。開源的Docker Registry鏡像只提供了Docker Registry API的服務端實現,足以支持Docker命令,不影響使用。但不包含圖形界面,以及鏡像維護、用戶管理、訪問控制等高級功能。

最後談談:Build,Ship,and Run

若是你搜索Docker官網,會發現以下的字樣:「Docker - Build, Ship, and Run Any App, Anywhere」。那麼Build,Ship,and Run究竟是在幹什麼呢?

  • Build(構建鏡像):鏡像就像是集裝箱包括文件以及運行環境等等資源。

  • Ship(運輸鏡像):主機和倉庫間運輸,這裏的倉庫就像是超級碼頭同樣。

  • Run (運行鏡像):運行的鏡像就是一個容器,容器就是運行程序的地方。

Docker運行過程也就是去倉庫把鏡像拉到本地,而後用一條命令把鏡像運行起來變成容器。因此,咱們也經常將Docker稱爲碼頭工人或碼頭裝卸工,這和Docker的中文翻譯搬運工人一模一樣。

相關文章
相關標籤/搜索