Docker Overview

在我的這篇文章Docker and Microservices - Hands On里,根據(jù)官方提供的教程,我成功地基于Docker部署了兩個Service應(yīng)用在AWS上,這篇文章嘗試從一個大的視角來介紹Docker。從哪些維度出發(fā)去認(rèn)識一個新的概念,在這篇文章認(rèn)識新事物的維度我表達(dá)了自己的觀點(diǎn)。

What is Docker

Docker 官方給出的定義是:

Docker is the company driving the container movement and the only container platform provider to address every application across the hybrid cloud.
Today’s businesses are under pressure to digitally transform but are constrained by existing applications and infrastructure while rationalizing an increasingly diverse portfolio of clouds, datacenters and application architectures. Docker enables true independence between applications and infrastructure and developers and IT ops to unlock their potential and creates a model for better collaboration and innovation.

Docker是一家容器平臺提供商。這個定義一目了然:Docker是一家公司,它提供的產(chǎn)品是“Container Platform”。那什么是Container Platform呢,我們把它拆分成ContainerPlatform來解釋。

Container

我們先看官方的解釋:

A container is a runtime instance of an image—what the image becomes in memory when actually executed. It runs completely isolated from the host environment by default, only accessing host files and ports if configured to do so.

這個解釋也很簡單:Container是Image的運(yùn)行時(shí)實(shí)例?!癐nstance”這個概念在軟件世界里很常見,比如在OO里,我們說對象(Object)是類(Class)的實(shí)例(Instance);在Web Service里,oDataRESTful API的實(shí)例。在解釋Image之前,我們暫且先把Image理解成一個Application,其架構(gòu)圖如下:

Container Diagram

從上圖我們可以知道:在一臺服務(wù)器主機(jī)上裝了操作系統(tǒng)(OS)來控制硬件并提供硬件訪問接口,然后在這個OS里裝了Docker之后,所有的Container就可以在Docker上面執(zhí)行了。所以Docker可以理解成Container的OS。這里我們可以把Container看作是JAVA世界里的一個JAR文件,當(dāng)我們寫好自己的JAVA應(yīng)用后我們會將其打包成JAR文件,里頭包含了配置文件,引用的外部庫等一系列信息,然后JVM就可以執(zhí)行這個JAR文件了。所以我們說:JAR是運(yùn)行在JVM上的。同樣的,Container是運(yùn)行在Docker上。

Image并不僅僅是一個Application,其官方解釋:

An image is a lightweight, stand-alone, executable package that includes everything needed to run a piece of software, including the code, a runtime, libraries, environment variables, and config files.

即Image是一個可執(zhí)行的文件包(Package),它里面包括了執(zhí)行一個軟件需要的所有東西:源代碼,運(yùn)行時(shí),庫文件,環(huán)境變量,配置文件。
那么誰來執(zhí)行Image這個Package呢?答案是Docker Engine了。就像exe文件由Windows系統(tǒng)來執(zhí)行,dmg文件由Mac OS X執(zhí)行一樣。
我們可以看下面兩張圖:


Docker Image (1/2)

Docker Image (2/2)

從上述兩張圖中我們可以得到一個重要信息,即:Docker的架構(gòu)是“Client-Server”型架構(gòu)。

What can Docker do

第一部分很枯燥,因?yàn)橐恢痹诮忉尭鞣N概念和定義,跟現(xiàn)實(shí)世界沒有任何的聯(lián)系。這部分嘗試從現(xiàn)實(shí)角度來介紹Docker。

The World W/O Docker

在Docker出現(xiàn)之前,一個網(wǎng)絡(luò)應(yīng)用程序是如何部署在生產(chǎn)環(huán)境并維護(hù)的呢?這是一個很大的話題,我的經(jīng)驗(yàn)和水平還不夠系統(tǒng)科學(xué)地去解釋這個問題,但是我想以一個在線購物網(wǎng)站為例來解釋其可能碰到的問題(真實(shí)情況下,在線購物網(wǎng)站其功能和架構(gòu)遠(yuǎn)比我下面所描述地要復(fù)雜得多)。

非常粗糙地講,一個在線購物網(wǎng)站應(yīng)該包括數(shù)據(jù)存儲,核心應(yīng)用邏輯(如用戶注冊,下訂單,支付),交互頁面等模塊。

最最最理想的情況下,如果第一次上線的產(chǎn)品能夠?qū)崿F(xiàn)所有的功能,后期不會再加入任何新的功能,并且其吞吐量無限大,支持任意數(shù)量的用戶的同時(shí)訪問和交互,數(shù)據(jù)存儲能力和檢索能力也能夠無限大。當(dāng)然這是絕對絕對不可能的?。?!產(chǎn)品的迭代升級和更新,對系統(tǒng)吞吐量和數(shù)據(jù)讀寫速度的要求,網(wǎng)絡(luò)帶寬等是軟件工程中最核心的幾個問題之一。

當(dāng)前該在線購物網(wǎng)站的支付方式只支持信用卡支付,隨著業(yè)務(wù)的發(fā)展,公司認(rèn)為應(yīng)該同時(shí)支持信用卡支付和支付寶支付。
對于這一需求,第一步當(dāng)然是在開發(fā)系統(tǒng)中新增支付寶支付的相關(guān)模塊并集成到原先的支付模塊中并完成測試。我們假設(shè)這個功能開發(fā)工程師已經(jīng)高質(zhì)量地完成而且QA也簽字通過,那么如何上線到生產(chǎn)環(huán)境呢。

  • 第一個方案:將新的項(xiàng)目包部署到生產(chǎn)系統(tǒng)服務(wù)器上,并代替舊的項(xiàng)目包,重新啟動服務(wù)器
    升級過程雖然簡單且易操作,但在升級期間該網(wǎng)站將會全部癱瘓,而且此時(shí)如果有用戶正在下訂單或者支付訂單,那么他的這一操作將會被中斷而且不可恢復(fù),甚至?xí)斐蓢?yán)重的數(shù)據(jù)不一致,如用戶已通過信用卡完成付款,系統(tǒng)正在更新訂單狀態(tài)為“已支付”時(shí)服務(wù)器卻無法訪問了。當(dāng)然,可以通過類似于緩存?zhèn)浞莺腿罩疚募刃畔?,在系統(tǒng)升級完成之后再來更新相應(yīng)的訂單,且不說這種事后處理機(jī)制能否保持絕對的正確性和零遺漏,其本身所造成的信息滯后和巨大的維護(hù)升級成本,對于購物平臺來說是非常難以接受的;而且在系統(tǒng)越來越龐大的時(shí)候,這種滯后和其所帶來的成本也會越來越大。

  • 第二個方案: 將用戶登陸模塊,下訂單模塊部署在核心入口服務(wù)器上,支付模塊等功能分開部署在不同的服務(wù)器上,“支持支付寶支付”這一功能只會影響到支付模塊所在的服務(wù)器。
    相比于第一個方案,用戶可以正常登陸網(wǎng)站并下訂單,只是不能完成支付,此時(shí)系統(tǒng)的可訪問性得到了極大地提高。但是因?yàn)橹Ц赌K部署在獨(dú)立的服務(wù)器上,所以需要增加新的中間件組件將請求派發(fā)到相應(yīng)的服務(wù)器上,這會增加額外的網(wǎng)絡(luò)訪問時(shí)間,而且引入了新的問題,即如何確保支付模塊功能與訂單狀態(tài)更新功能之間的一致性問題(消息隊(duì)列,事務(wù)型消息隊(duì)列等可以解決這一問題,我的這篇文章消息中間件使用場景有具體的介紹。此時(shí),對于正在進(jìn)行的支付消息,可以在支付隊(duì)列中根據(jù)其狀態(tài)來很好地管理決定補(bǔ)救措施。對于新進(jìn)來的消息隊(duì)列,可以有相應(yīng)的策略來管理,比如直接拒絕其進(jìn)入消息隊(duì)列)。

The World W/ Docker

我們前面介紹了軟件升級和新功能交付上線時(shí)所可能面臨的問題,而且我舉的例子只是冰山一角,可見其復(fù)雜性和由此帶來的巨大的成本。對于如何解決這一問題有一個特定的軟件工程實(shí)踐叫DevOps,其是在傳統(tǒng)的開發(fā),測試,運(yùn)維的基礎(chǔ)上增加的新角色:

DevOps
這個定義很好地解釋了DevOps:

DevOps is a set of practices intended to reduce the time between committing a change to a system and the change being placed into normal production, while ensuring high quality.[9]
-- From WikiPedia

基于DevOps這個角度,Docker可以認(rèn)為是:

Docker is a tool that is designed to benefit both developers and system administrators, making it a part of many DevOps (developers + operations) toolchains.For developers, it means that they can focus on writing code without worrying about the system that it will ultimately be running on. It also allows them to get a head start by using one of thousands of programs already designed to run in a Docker container as a part of their application. For operations staff, Docker gives flexibility and potentially reduces the number of systems needed because of its small footprint and lower overhead.
-- From here

Summary

使用Docker,軟件工程師只需將自己的項(xiàng)目代碼Docker化(Dockerize)并打包成Docker Image,然后交由Docker來管理項(xiàng)目的部署和新功能的交付。而且,Docker提供了一系列的工具來幫助開發(fā)人員監(jiān)控和管理項(xiàng)目的狀態(tài)。此外,Docker還支持同AWS, Azure等Cloud Provider的集成,即部署在這些平臺的應(yīng)用也可以使用Docker來托管。Docker(Container Platform)是通過提供一系列工具完成項(xiàng)目部署并保證高質(zhì)量的持續(xù)交付的最佳實(shí)踐之一。
當(dāng)然,Container這一概念有很多優(yōu)勢,但是它絕對不是Silver Bullet, 關(guān)于其具體的優(yōu)缺點(diǎn),這篇博客講得很詳細(xì).

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前段時(shí)間投入了一點(diǎn)精力放到了SVG動畫上是因?yàn)樵陧?xiàng)目中用到了動態(tài)加載圖標(biāo)以及字體圖標(biāo),所以順便把這些相關(guān)的內(nèi)容補(bǔ)了...
    泱泱悲秋閱讀 1,346評論 0 4
  • 我是一個流浪漢 我孤身一人 沒有房子,沒有雨傘 聽說明天要下雨 我不想未雨綢繆 明天的問題就交給明天的我來處理吧 ...
    六便士__閱讀 131評論 0 1

友情鏈接更多精彩內(nèi)容