本文只是對Docker的概念作了較爲詳細的介紹,並不涉及一些像Docker環境的安裝以及Docker的一些常見操做和命令。前端
閱讀本文大概須要15分鐘,經過閱讀本文你將知道一下概念:面試
Docker 是世界領先的軟件容器平臺,因此想要搞懂Docker的概念咱們必須先從容器開始提及。docker
一句話歸納容器:容器就是將軟件打包成標準化單元,以用於開發、交付和部署。數據庫
若是須要通俗的描述容器的話,我以爲容器就是一個存放東西的地方,就像書包能夠裝各類文具、衣櫃能夠放各類衣服、鞋架能夠放各類鞋子同樣。咱們如今所說的容器存放的東西可能更偏向於應用好比網站、程序甚至是系統環境。後端
關於虛擬機與容器的對比在後面會詳細介紹到,這裏只是經過網上的圖片加深你們對於物理機、虛擬機與容器這三者的理解。安全
物理機 服務器
虛擬機:微信
容器:網絡
經過上面這三張抽象圖,咱們能夠大概能夠經過類比歸納出: 容器虛擬化的是操做系統而不是硬件,容器之間是共享同一套操做系統資源的。虛擬機技術是虛擬出一套硬件後,在其上運行一個完整操做系統。所以容器的隔離級別會稍低一些。架構
相信經過上面的解釋你們對於容器這個既陌生又熟悉的概念有了一個初步的認識,下面咱們就來談談Docker的一些概念。
說實話關於Docker是什麼並太好說,下面我經過四點向你說明Docker究竟是個什麼東西。
在一臺機器上運行的多個 Docker 容器能夠共享這臺機器的操做系統內核;它們可以迅速啓動,只需佔用不多的計算和內存資源。鏡像是經過文件系統層進行構造的,並共享一些公共文件。這樣就能儘可能下降磁盤用量,並能更快地下載鏡像。
Docker 容器基於開放式標準,可以在全部主流 Linux 版本、Microsoft Windows 以及包括 VM、裸機服務器和雲在內的任何基礎設施上運行。
Docker 賦予應用的隔離性不只限於彼此隔離,還獨立於底層的基礎設施。Docker 默認提供最強的隔離,所以應用出現問題,也只是單個容器的問題,而不會波及到整臺機器。
每當提及容器,咱們不得不將其與虛擬機作一個比較。就我而言,對於二者無所謂誰會取代誰,而是二者能夠和諧共存。
簡單來講: 容器和虛擬機具備類似的資源隔離和分配優點,但功能有所不一樣,由於容器虛擬化的是操做系統,而不是硬件,所以容器更容易移植,效率也更高。
傳統虛擬機技術是虛擬出一套硬件後,在其上運行一個完整操做系統,在該系統上再運行所需應用進程;而容器內的應用進程直接運行於宿主的內核,容器內沒有本身的內核,並且也沒有進行硬件虛擬。所以容器要比傳統虛擬機更爲輕便.
容器是一個應用層抽象,用於將代碼和依賴資源打包在一塊兒。 多個容器能夠在同一臺機器上運行,共享操做系統內核,但各自做爲獨立的進程在用戶空間中運行 。與虛擬機相比, 容器佔用的空間較少(容器鏡像大小一般只有幾十兆),瞬間就能完成啓動 。
虛擬機 (VM) 是一個物理硬件層抽象,用於將一臺服務器變成多臺服務器。 管理程序容許多個 VM 在一臺機器上運行。每一個VM都包含一整套操做系統、一個或多個應用、必要的二進制文件和庫資源,所以 佔用大量空間 。並且 VM 啓動也十分緩慢 。
經過Docker官網,咱們知道了這麼多Docker的優點,可是你們也沒有必要徹底否認虛擬機技術,由於二者有不一樣的使用場景。虛擬機更擅長於完全隔離整個運行環境。例如,雲服務提供商一般採用虛擬機技術隔離不一樣的用戶。而 Docker一般用於隔離不一樣的應用 ,例如前端,後端以及數據庫。
就我而言,對於二者無所謂誰會取代誰,而是二者能夠和諧共存。
Docker中很是重要的三個基本概念,理解了這三個概念,就理解了 Docker 的整個生命週期。
Docker 包括三個基本概念
理解了這三個概念,就理解了 Docker 的整個生命週期
操做系統分爲內核和用戶空間。對於 Linux 而言,內核啓動後,會掛載 root 文件系統爲其提供用戶空間支持。而Docker 鏡像(Image),就至關因而一個 root 文件系統。
Docker 鏡像是一個特殊的文件系統,除了提供容器運行時所需的程序、庫、資源、配置等文件外,還包含了一些爲運行時準備的一些配置參數(如匿名卷、環境變量、用戶等)。 鏡像不包含任何動態數據,其內容在構建以後也不會被改變。
Docker 設計時,就充分利用 Union FS的技術,將其設計爲 分層存儲的架構 。 鏡像實際是由多層文件系統聯合組成。
鏡像構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不會再發生改變,後一層上的任何改變只發生在本身這一層。 好比,刪除前一層文件的操做,實際不是真的刪除前一層的文件,而是僅在當前層標記爲該文件已刪除。在最終容器運行的時候,雖然不會看到這個文件,可是實際上該文件會一直跟隨鏡像。所以,在構建鏡像的時候,須要額外當心,每一層儘可能只包含該層須要添加的東西,任何額外的東西應該在該層構建結束前清理掉。
分層存儲的特徵還使得鏡像的複用、定製變的更爲容易。甚至能夠用以前構建好的鏡像做爲基礎層,而後進一步添加新的層,以定製本身所需的內容,構建新的鏡像。
鏡像(Image)和容器(Container)的關係,就像是面向對象程序設計中的 類 和 實例 同樣,鏡像是靜態的定義,容器是鏡像運行時的實體。容器能夠被建立、啓動、中止、刪除、暫停等 。
容器的實質是進程,但與直接在宿主執行的進程不一樣,容器進程運行於屬於本身的獨立的 命名空間。前面講過鏡像使用的是分層存儲,容器也是如此。
容器存儲層的生存週期和容器同樣,容器消亡時,容器存儲層也隨之消亡。所以,任何保存於容器存儲層的信息都會隨容器刪除而丟失。
按照 Docker 最佳實踐的要求,容器不該該向其存儲層內寫入任何數據 ,容器存儲層要保持無狀態化。全部的文件寫入操做,都應該使用數據卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。數據卷的生存週期獨立於容器,容器消亡,數據卷不會消亡。所以, 使用數據卷後,容器能夠隨意刪除、從新 run ,數據卻不會丟失。
鏡像構建完成後,能夠很容易的在當前宿主上運行,可是, 若是須要在其它服務器上使用這個鏡像,咱們就須要一個集中的存儲、分發鏡像的服務,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 的公開服務。好比 時速雲鏡像庫、網易雲鏡像服務、DaoCloud 鏡像市場、阿里雲鏡像庫等。
除了使用公開服務外,用戶還能夠在 本地搭建私有 Docker Registry 。Docker 官方提供了 Docker Registry 鏡像,能夠直接使用作爲私有 Registry 服務。開源的 Docker Registry 鏡像只提供了 Docker Registry API 的服務端實現,足以支持 docker 命令,不影響使用。但不包含圖形界面,以及鏡像維護、用戶管理、訪問控制等高級功能。
Docker的概念基本上已經講完,最後咱們談談:Build, Ship, and Run。
若是你搜索Docker官網,會發現以下的字樣:「Docker - Build, Ship, and Run Any App, Anywhere」。那麼Build, Ship, and Run究竟是在幹什麼呢?
Docker 運行過程也就是去倉庫把鏡像拉到本地,而後用一條命令把鏡像運行起來變成容器。因此,咱們也經常將Docker稱爲碼頭工人或碼頭裝卸工,這和Docker的中文翻譯搬運工人一模一樣。
本文主要把Docker中的一些常見概念作了詳細的闡述,可是並不涉及Docker的安裝、鏡像的使用、容器的操做等內容。這部分東西,但願讀者本身能夠經過閱讀書籍與官方文檔的形式掌握。若是以爲官方文檔閱讀起來很費力的話,這裏推薦一本書籍《Docker技術入門與實戰第二版》。
若是你以爲個人文章對你有幫助話,歡迎關注個人微信公衆號:"Java面試通關手冊"(一個有溫度的微信公衆號,無廣告,單純技術分享,期待與你共同進步~~~堅持原創,分享美文,分享各類Java學習資源。你想關注便關注,公衆號只是我記錄文字和生活的地方,無所謂利益。)