最近在工作中一直在忙基礎設施構建,發現在選型的時候,大家心裡基本上都有一個自己的成熟架構。而在服務部署這塊發現公司的同事們都大多數考慮Docker,在業餘閑聊了後,發現他們對Docker只是在停留在使用,對一些Docker的基本知識還是不了解,並不清楚 Docker 到底是什麼,要解決什麼問題,好處又在哪裡?今天就來詳細解釋,幫助大家理解它,還帶有簡單易懂的實例,教你如何將它用於日常開發並用其部署微服務。

Docker簡介

Docker是基於Go語言實現的雲開源項目,誕生於2013年初,最初發起者是dotCloud公司。Docker自開源後受到廣泛的關注和討論,目前已有多個相關項目,逐漸形成了圍繞Docker的生態體系。dotCloud公司後來也改名為Docker Inc,專註於Docker相關技術和產品的開發。Docker 一直廣受矚目,被認為可能會改變軟體行業。那麼什麼是Docker呢?我查閱了網上的一些相關資料,現用一段話總結了一下。 Docker是一個開源的容器引擎,它可以幫助我們更快地交付應用。Docker可將應用程序和基礎設施層隔離,並且能將基礎設施當作程序一樣進行管理。使用Docker,可更快地打包、測試以及部署應用程序,並可減少從編寫到部署運行代碼的周期。 對一個事物有了一定了解後,我們的繼續學習Docker官方的給出文檔和源碼。(這個今天不在此文章擴展,不然聊不完。)

TIPS

(1) Docker官方網站:docker.com/

(2) Docker GitHub:github.com/docker/docke

Docker快速入門

執行如下命令,即可啟動一個Nginx容器

docker run -d -p 91:80 nginx

Docker架構

我們來看一下來自Docker官方文檔的架構圖,如圖所示。

我們來講解上圖中包含的組件。

(1) Docker daemon(Docker守護進程)

Docker daemon是一個運行在宿主機(DOCKER_HOST)的後台進程。我們可通過Docker客戶端與之通信。

(2) Client(Docker客戶端)

Docker客戶端是Docker的用戶界面,它可以接受用戶命令和配置標識,並與Docker daemon通信。圖中,docker build等都是Docker的相關命令。

(3) Images(Docker鏡像)

Docker鏡像是一個只讀模板,它包含創建Docker容器的說明。它和系統安裝光碟有點像——我們使用系統安裝光碟安裝系統,同理,我們使用Docker鏡像運行Docker鏡像中的程序。

(4) Container(容器)

容器是鏡像的可運行實例。鏡像和容器的關係有點類似於面向對象中,類和對象的關係。我們可通過Docker API或者CLI命令來啟停、移動、刪除容器。

(5) Registry

Docker Registry是一個集中存儲與分發鏡像的服務。我們構建完Docker鏡像後,就可在當前宿主機上運行。但如果想要在其他機器上運行這個鏡像,我們就需要手動拷貝。此時,我們可藉助Docker Registry來避免鏡像的手動拷貝。

一個Docker Registry可包含多個Docker倉庫;每個倉庫可包含多個鏡像標籤;每個標籤對應一個Docker鏡像。這跟Maven的倉庫有點類似,如果把Docker Registry比作Maven倉庫的話,那麼Docker倉庫就可理解為某jar包的路徑,而鏡像標籤則可理解為jar包的版本號。

Docker Registry可分為公有Docker Registry和私有Docker Registry。最常用的Docker Registry莫過於官方的Docker Hub,這也是默認的Docker Registry。Docker Hub上存放著大量優秀的鏡像,我們可使用Docker命令下載並使用。

Docker應用場景

常用的8個Docker的真實使用場景,分別是簡化配置、代碼流水線管理、提高開發效率、隔離應用、整合伺服器、調試能力、多租戶環境、快速部署。我們一直在談Docker,Docker怎麼使用,在怎麼樣的場合下使用?

首先你在享有Docker帶來的虛擬化能力的時候無需擔心它帶來的額外開銷。其次,相比於虛擬機,你可以在同一台機器上創建更多數量的容器。

Docker的另外一個優點是容器的啟動與停止都能在幾秒中內完成。Docker公司的創始人 Solomon Hykes曾經介紹過Docker在單純的LXC之上做了哪些事情,你可以去看看。

下面是我總結的一些Docker的使用場景,它為你展示了如何藉助Docker的優勢,在低開銷的情況下,打造一個一致性的環境。

簡化配置

這是Docker公司宣傳的Docker的主要使用場景。虛擬機的最大好處是能在你的硬體設施上運行各種配置不一樣的平台(軟體、系統),Docker在降低額外開銷的情況下提供了同樣的功能。它能讓你將運行環境和配置放在代碼中然後部署,同一個Docker的配置可以在不同的環境中使用,這樣就降低了硬體要求和應用環境之間耦合度。

代碼流水線(Code Pipeline)管理

前一個場景對於管理代碼的流水線起到了很大的幫助。代碼從開發者的機器到最終在生產環境上的部署,需要經過很多的中間環境。而每一個中間環境都有自己微小的差別,Docker給應用提供了一個從開發到上線均一致的環境,讓代碼的流水線變得簡單不少。

提高開發效率

這就帶來了一些額外的好處:Docker能提升開發者的開發效率。如果你想看一個詳細一點的例子,可以參考Aater在DevOpsDays Austin 2014 大會或者是DockerCon上的演講。

不同的開發環境中,我們都想把兩件事做好。一是我們想讓開發環境盡量貼近生產環境,二是我們想快速搭建開發環境。

理想狀態中,要達到第一個目標,我們需要將每一個服務都跑在獨立的虛擬機中以便監控生產環境中服務的運行狀態。然而,我們卻不想每次都需要網路連接,每次重新編譯的時候遠程連接上去特別麻煩。這就是Docker做的特別好的地方,開發環境的機器通常內存比較小,之前使用虛擬的時候,我們經常需要為開發環境的機器加內存,而現在Docker可以輕易的讓幾十個服務在Docker中跑起來。

隔離應用

有很多種原因會讓你選擇在一個機器上運行不同的應用,比如之前提到的提高開發效率的場景等。

我們經常需要考慮兩點,一是因為要降低成本而進行伺服器整合,二是將一個整體式的應用拆分成松耦合的單個服務(譯者註:微服務架構)。如果你想了解為什麼松耦合的應用這麼重要,請參考Steve Yege的這篇論文,文中將Google和亞馬遜做了比較。

整合伺服器

正如通過虛擬機來整合多個應用,Docker隔離應用的能力使得Docker可以整合多個伺服器以降低成本。由於沒有多個操作系統的內存佔用,以及能在多個實例之間共享沒有使用的內存,Docker可以比虛擬機提供更好的伺服器整合解決方案。

調試能力

Docker提供了很多的工具,這些工具不一定只是針對容器,但是卻適用於容器。它們提供了很多的功能,包括可以為容器設置檢查點、設置版本和查看兩個容器之間的差別,這些特性可以幫助調試Bug。你可以在《Docker拯救世界》的文章中找到這一點的例證。

多租戶環境

另外一個Docker有意思的使用場景是在多租戶的應用中,它可以避免關鍵應用的重寫。我們一個特別的關於這個場景的例子是為IoT(譯者註:物聯網)的應用開發一個快速、易用的多租戶環境。這種多租戶的基本代碼非常複雜,很難處理,重新規劃這樣一個應用不但消耗時間,也浪費金錢。

使用Docker,可以為每一個租戶的應用層的多個實例創建隔離的環境,這不僅簡單而且成本低廉,當然這一切得益於Docker環境的啟動速度和其高效的diff命令。

你可以在這裡了解關於此場景的更多信息。

快速部署

在虛擬機之前,引入新的硬體資源需要消耗幾天的時間。虛擬化技術(Virtualization)將這個時間縮短到了分鐘級別。而Docker通過為進程僅僅創建一個容器而無需啟動一個操作系統,再次將這個過程縮短到了秒級。這正是Google和Facebook都看重的特性。

你可以在數據中心創建銷毀資源而無需擔心重新啟動帶來的開銷。通常數據中心的資源利用率只有30%,通過使用Docker並進行有效的資源分配可以提高資源的利用率。


推薦閱讀:
相关文章