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