了解輕量級的、可移植的、自包含的Docker容器是如何改進(jìn)軟件開發(fā)、應(yīng)用程序部署和業(yè)務(wù)敏捷性的。
1981年出版的一本名為《將果凍釘在樹上》的書將軟件描述為是一種“模糊不清且難以把控的東西”。其實(shí),不僅在1981年的時(shí)候是如此,近40年來也一直是如此。軟件,無論是你購買的應(yīng)用程序還是你自己構(gòu)建的應(yīng)用程序,都很難部署、管理和運(yùn)行。
現(xiàn)在,Docker容器提供了一種新的控制軟件的方法。您可以使用Docker來包裝應(yīng)用程序,以便處理應(yīng)用程序的部署和運(yùn)行時(shí)問題——包括如何在網(wǎng)絡(luò)上公開應(yīng)用程序,如何管理應(yīng)用程序?qū)Υ鎯蛢?nèi)存以及I/O的使用,如何控制應(yīng)用程序?qū)ν獾脑L問權(quán)限,以及如何讓所有在容器中的應(yīng)用程序保持一致。您可以在安裝了Docker runtime的任何兼容主機(jī)(Linux或Windows)上運(yùn)行Docker容器。
除了這種方便的封裝,隔離,可移植性和控制之外,Docker還提供了許多其他好處。 Docker容器很小(兆字節(jié)),并且啟動迅速。它們有自己內(nèi)置的版本控制和組件重用的機(jī)制。它們可以輕松的通過公共Docker Hub或私有存儲庫進(jìn)行共享。
在本文中,我將探討Docker容器是如何使軟件的構(gòu)建和部署變得更加容易的——包括容器可以解決的問題,它們是如何解決這些問題的,以及何時(shí)才是使用容器的最佳時(shí)機(jī)。
在Docker容器出現(xiàn)之前
多年來,企業(yè)軟件通常部署在“裸機(jī)”(即安裝在對底層硬件具有完全控制權(quán)的操作系統(tǒng)上)或虛擬機(jī)(即安裝在與其他客戶機(jī)操作系統(tǒng)共享底層硬件的操作系統(tǒng)上)上。顯然,在裸機(jī)上安裝會讓軟件很難移動,也很難更新——這兩個(gè)限制使得傳統(tǒng)IT很難靈活應(yīng)對業(yè)務(wù)需求的變化。
后來出現(xiàn)了虛擬化。虛擬化平臺(也稱為“虛擬機(jī)管理程序”)允許多個(gè)虛擬機(jī)共享一個(gè)物理系統(tǒng),每個(gè)虛擬機(jī)以獨(dú)立的方式模擬整個(gè)系統(tǒng)的行為,包括自己的操作系統(tǒng)、存儲和I/O。這樣,IT可以更有效地響應(yīng)業(yè)務(wù)需求的變化,因?yàn)榭梢钥寺?,?fù)制,遷移虛擬機(jī)以及快速的增減資源以滿足需求或節(jié)省資源。
虛擬機(jī)也有助于降低成本,因?yàn)楦嗵摂M機(jī)可以整合到更少的物理機(jī)器上。運(yùn)行舊應(yīng)用程序的遺留系統(tǒng)可以轉(zhuǎn)換為虛擬機(jī)并在物理上退役,以節(jié)省更多資金。
但是虛擬機(jī)仍然存在一些問題。虛擬機(jī)是本身就很巨大(千兆字節(jié)),每一個(gè)虛擬機(jī)都包含一個(gè)完整的操作系統(tǒng)。因而能夠整合到單個(gè)系統(tǒng)中的虛擬化應(yīng)用程序非常有限。另外,調(diào)配虛擬機(jī)仍然需要相當(dāng)長的時(shí)間。所以,虛擬機(jī)的可移植性依然有限。到達(dá)一定程度以后,虛擬機(jī)便無法再滿足快速發(fā)展的企業(yè)所需求的速度、靈活性和低成本了。
Docker容器的好處
容器的工作方式有點(diǎn)像虛擬機(jī),但更具體和精細(xì)。它們將單個(gè)應(yīng)用程序及其依賴項(xiàng)(應(yīng)用程序需要運(yùn)行的所有外部軟件庫)從底層操作系統(tǒng)和其他容器中隔離開來。所有容器化的應(yīng)用程序都共享一個(gè)單一的通用操作系統(tǒng)(Linux或Windows),但它們彼此之間以及整個(gè)系統(tǒng)之間是分開的。
Docker容器的好處在很多地方都有體現(xiàn)。以下是Docker和容器的一些主要優(yōu)點(diǎn):
Docker可以更有效地使用系統(tǒng)資源
容器化應(yīng)用程序的實(shí)例使用的內(nèi)存比虛擬機(jī)少得多,它們啟動和停止的速度更快,可以在主機(jī)硬件上更密集地進(jìn)行打包。所有的這些都意味著它能夠極大的減少IT開支。
節(jié)省的成本將取決于應(yīng)用程序的使用情況以及它們對資源使用的密集程度,但容器總是能夠比虛擬機(jī)更高效。相應(yīng)的,這也節(jié)省了軟件許可證的成本,因?yàn)檫\(yùn)行相同的工作負(fù)載需要更少的操作系統(tǒng)實(shí)例。
Docker支持更快的軟件交付周期
企業(yè)軟件必須對不斷變化的環(huán)境做出快速反應(yīng)。這意味著需要一個(gè)既易于擴(kuò)展以滿足需求,又易于更新以根據(jù)業(yè)務(wù)需要添加新功能的運(yùn)行環(huán)境。
Docker容器使將具有新業(yè)務(wù)特性的新版本軟件快速投入生產(chǎn)——如果需要,也可以快速回滾到以前的版本。它們還使得實(shí)施藍(lán)/綠部署等戰(zhàn)略變得更加容易。
Docker支持應(yīng)用程序的可移植性
有時(shí)選擇在哪里運(yùn)行企業(yè)應(yīng)用程序是至關(guān)重要的——在防火墻后面,可以讓應(yīng)用變得更加可靠和安全;在公共云中,可以提高應(yīng)用的可訪問性和資源彈性。而Docker容器封裝了應(yīng)用程序運(yùn)行所需要的所有東西,所以它們能夠允許應(yīng)用程序在不同的環(huán)境之間輕松穿梭。所有安裝了Docker runtime的主機(jī)——無論是開發(fā)人員的筆記本電腦還是公共云實(shí)例——都可以運(yùn)行Docker容器。
Docker讓微服務(wù)架構(gòu)更加閃耀
輕量級的、可移植的、獨(dú)立的Docker容器使得構(gòu)建前瞻性軟件架構(gòu)變得更加容易,因此您不需要試圖使用昨天的開發(fā)方法來解決明天的問題。
其中的一種受益于此的軟件開發(fā)模式就是微服務(wù),它需要由許多松散耦合的組件來共同組成一個(gè)應(yīng)用程序。通過將傳統(tǒng)的“單一的”應(yīng)用程序分解成許多獨(dú)立的服務(wù),微服務(wù)允許業(yè)務(wù)線應(yīng)用程序的不同部分由獨(dú)立的團(tuán)隊(duì)和獨(dú)立的時(shí)間軸被獨(dú)立地?cái)U(kuò)展、修改和服務(wù)——只要它能夠滿足業(yè)務(wù)需求。
容器不需要實(shí)現(xiàn)微服務(wù),但是它非常適合微服務(wù)方法和敏捷開發(fā)。
Docker容器無法解決的問題
關(guān)于容器,首先要記住的是:它也并不是萬能的。Docker容器本身并不能解決所有問題。特別是:
Docker無法解決您的安全問題
在默認(rèn)情況下,容器中的軟件確實(shí)比在裸機(jī)上運(yùn)行的軟件更安全,但這就好比說,鎖著門的房子比不鎖著門的房子更安全。但這也需要視情況而定。容器可以為應(yīng)用程序添加一層保護(hù)層,但也是僅作為在上下文中保護(hù)應(yīng)用程序的一般程序的一部分而已。
Docker不會將應(yīng)用程序神奇地轉(zhuǎn)變?yōu)槲⒎?wù)
如果您將現(xiàn)有應(yīng)用程序容器化,的確可以減少其資源消耗并使其更易于部署。但它不會自動更改應(yīng)用程序的設(shè)計(jì),也不會自動更改其與其他應(yīng)用程序的交互方式。這些東西只能通過開發(fā)人員的時(shí)間和努力來實(shí)現(xiàn),而不是通過將所有內(nèi)容都轉(zhuǎn)移到容器中。
將一個(gè)老式的獨(dú)立的或SOA風(fēng)格的應(yīng)用程序放在容器中,你最終會得到也只是一個(gè)容器中的舊應(yīng)用程序。這對你的工作沒有任何幫助;如果說有什么區(qū)別的話,那就是它可能會讓它變得不那么有用。
Docker不是虛擬機(jī)的替代品
關(guān)于容器的一個(gè)持久的話題是,它們最終將淘汰虛擬機(jī)。許多以前在虛擬機(jī)中運(yùn)行的應(yīng)用程序都可以被移動到容器中,但這并不意味著所有的應(yīng)用程序都可以或應(yīng)該被移動到容器中。例如,如果您所在的行業(yè)具有嚴(yán)格的監(jiān)管要求,那么您可能無法將虛擬機(jī)替換為容器,因?yàn)樘摂M機(jī)提供的隔離性比容器更強(qiáng)。
Docker容器的使用
傳統(tǒng)企業(yè)的開發(fā)工作常常因其保守的文化和對變化的麻木遲鈍而聲名狼藉。企業(yè)開發(fā)人員也一直對這些限制感到惱火——包括IT強(qiáng)加給他們的限制,以及整個(gè)企業(yè)對他們的要求。然而,Docker和容器為開發(fā)人員提供了更多他們所渴望的自由,同時(shí)提供了新的構(gòu)建業(yè)務(wù)應(yīng)用程序的方法,讓他們能夠快速響應(yīng)不斷變化的業(yè)務(wù)條件。