什么是Docker?它是如何解決業(yè)務難題的?
Docker是一個開發(fā)人員容納和輕松發(fā)布軟件的平臺。它有助于消除配置環(huán)境以運行軟件的開銷,實質上是將環(huán)境與代碼一起運送。
我們通常使用裝運容器類比來解釋。貨運公司負責將集裝箱從A運輸?shù)紹,他們不關心您放入集裝箱的貨物,但他們確實關心您是否以正確的格式將貨物交給他們。
將您的開發(fā)人員視為將軟件打包到容器的創(chuàng)造者。他們構建的內(nèi)容可能會因特殊庫、優(yōu)化或配置而變得復雜。一旦他們準備好運送的軟件,就該把它交給一家知道如何從A到B的貨運公司。幸運的是,現(xiàn)在它采用標準化格式,DevOps可以輕松地將其轉移到生產(chǎn)中。他們甚至可以自動化這個過程,以便將來更容易。
在本文中,我們將舉例說明Docker的業(yè)務用例,概述如何構建Docker化的微服務,使用Amazon的彈性容器服務(ECS),并概述使用Docker能帶來的的商業(yè)利益。
Docker和微服務架構的用例
假設您的Web應用程序有一個資源密集型的用戶注冊頁面。在每月月初 新用戶會蜂擁而至。為了處理負載,您的服務器基礎結構正在幾個大型負載平衡服務器上運行(如下所示)。不幸的是,這種處理規(guī)模一年中只有12天。這意味著您的公司將為大部分時間都沒有使用的資源付費。
現(xiàn)在,假如一個關鍵功能在注冊過程中發(fā)生了變化:出于法律原因,用戶需要被置于二級報告系統(tǒng)中。目前,您的注冊代碼隱藏在應用程序的剩余部分中,將此修復程序移至生產(chǎn)意味著整個系統(tǒng)的完全重新部署。開發(fā)人員和基礎設施將在本周末加班工作,以執(zhí)行這一更新。最糟糕的是,這僅僅是一個相對較小的變化!
在Docker化的世界中,這是小case。注冊過程可以與主應用程序分離,并使用滾動更新推送到生產(chǎn)環(huán)境。你可以星期一做,甚至不需要把網(wǎng)站關閉。無人不為之喝彩,因為這意味著軟件可以快速安全地投入生產(chǎn)。
為了達到這一點,開發(fā)人員可以通過構建REST服務來啟動解耦注冊過程。一旦Web前端和注冊服務的代碼分離,它們就可以進行Docker化。開發(fā)人員可以將所有代碼、庫和配置打包到Docker Images中并移交給DevOps。 Docker Swarm,Amazon ECS或Red Hat的OpenShift等集群工具將使DevOps能夠托管Docker容器。他們可以用這些系統(tǒng)在需求高時擴大規(guī)模,在需求低時縮小規(guī)模。以經(jīng)濟有效的方式利用資源又反過來解決了我們的***個問題。
使用Docker和微服務架構
解決可擴展性和解耦代碼
讓我們用我們的示例項目來說明這個容器化的基礎設施。此代碼包含Web前端和注冊后端。您可能會注意到這些被分成兩個單獨的代碼倉庫。沒關系,在面向服務的體系結構中,這些服務相互了解的越少越好。
在下圖中,我們可以看到生活在Amazon ECS群集內(nèi)的Web和注冊容器。用戶注冊請求將到達Web前端,然后可以向任何注冊服務詢問進行響應。
讓我們開始克隆示例項目。
確保安裝了Docker和Gradle,以便我們可以構建項目和圖像。
您可以運行以下命令來查看Docker引擎中的圖像。
請注意,我們現(xiàn)在有兩個圖像加上它們構建的基本圖像。只是為了好玩,讓我們啟動網(wǎng)絡應用程序并訪問。獲取Docker Web映像并將其作為在本地虛擬機上運行的容器啟動。
我們讓托管機器訪問8080端口上的容器。使用以下命令,我們現(xiàn)在可以看到它正在運行。
使用亞馬遜的彈性容器服務
要真正了解這些Docker圖像的優(yōu)勢,我們需要一個可擴展的基礎架構來運行它們。出于本演示的目的,Amazon ECS會做得很好。要將圖像輸出到Amazon云,您需要安裝AWS命令行界面。
亞馬遜提供了一個很棒的向導來幫助簡化這個過程。在其中,您將執(zhí)行以下操作
- 創(chuàng)建一個Docker存儲庫來托管您的圖像
- 將圖像上傳到云端(見下文)
- 創(chuàng)建運行映像的EC2實例集群
- 將您的圖像分組到服務Service中
要將Docker圖像推送到云端,您需要先登錄。
上面的命令生成一個“docker login”,它將Docker主機指向遠程倉庫。這將授予對每個AWS賬戶附帶的默認AWS注冊表的訪問權限。
請注意,上述注冊表可以包含許多存儲庫。存儲庫包含圖像的版本。對于此項目,您將需要兩個存儲庫。一個用于我們的Web圖像,一個用于注冊圖像。
為了將圖像發(fā)送到遠程倉庫,需要對其進行適當標記。像這樣使用您的AWS倉庫的URL。
現(xiàn)在讓我們將它們推送到AWS。
使用Docker容器擴展ECS
在上一節(jié)中,您使用向導創(chuàng)建了一個EC2實例群集。我們創(chuàng)建了兩個代碼倉庫來保存我們的圖像并將其上傳到那里。我們來看一下。
您還可以看到我的群集在其已完成狀態(tài)下有3臺服務器,其上運行4個Docker鏡像(參見上圖)。
上面還列出了我們從群集配置的服務。服務允許您對Docker容器進行分組并指定選項,例如您想要多少個選項,以及如何平衡它們之間的流量。
如果您正確配置了Load Balancer,則可以在瀏覽器中訪問它。請求將分發(fā)到群集中的活動容器數(shù)。
這是我們建立的注冊服務的手動請求?;叵胍幌拢摲赵诙丝?081上運行,以免與端口8080上的注冊服務沖突。Load Balancer負責將所有這些隱藏起來。我們可以通過端口80從注冊服務獲得結果。
使用Docker之后
這個快速概述僅涉及Docker和微服務架構如何用于為您的團隊和產(chǎn)品進行重大改進。以下是采用此架構時可以看到的一些明顯的好處。
- 降低成本
- 加快發(fā)展
- 更快,更一致的部署
- 松散耦合的代碼和團隊
- 更易于維護和擴展
- 更可靠的基礎設施
如果您希望在更大的環(huán)境中利用Docker,那么我們建議您考慮使用Spring Netflix和OpenShift等解決方案。這些解決方案適用于更大的Docker生態(tài)系統(tǒng),可以使部署和開發(fā)更加輕松。
【本文是51CTO專欄作者數(shù)據(jù)星河的原創(chuàng)文章,作者微信公眾號數(shù)據(jù)星河(ID:BDG-store)】