- Docker實踐(第2版)
- (英)伊恩·米爾 艾丹·霍布森·塞耶斯
- 2503字
- 2021-01-08 22:12:12
1.1 Docker是什么以及為什么用Docker
在動手實踐之前,我們將對Docker稍作討論,以便讀者了解它的背景、“Docker”名字的來歷以及為什么使用它。
1.1.1 Docker是什么
要理解Docker是什么,從一個比喻開始會比技術(shù)性解釋來得簡單,而且這個Docker的比喻非常有說服力。Docker這個單詞原本是指在船只停靠港口之后將商品移進或移出的碼頭工人。箱子和物品的大小、形狀各異,而有經(jīng)驗的碼頭工人能以合算的方式手工將商品裝入船只,因而他們倍受青睞(見圖1-2)。雇人搬東西并不便宜,但除此之外別無他法。
對在軟件行業(yè)工作的人來說,這聽起來應(yīng)該很熟悉。大量時間和精力被花在將奇形怪狀的軟件放置到裝滿了其他奇形怪狀的軟件、大小各異的船只上,以便將其賣給其他地方的用戶或商業(yè)機構(gòu)。
圖1-3展示了使用Docker概念時如何能節(jié)省時間和金錢。在Docker出現(xiàn)之前,部署軟件到不同環(huán)境所需的工作量巨大。即使不是采用手工運行腳本的方式在不同機器上進行軟件配備(有很多人這么做),用戶也不得不全力應(yīng)付那些配置管理工具,它們掌管著渴求資源且快速變化的環(huán)境的狀態(tài)。即便將這些工作封裝到虛擬機中,還是需要花費大量時間來部署這些虛擬機,等待它們啟動并管理它們所產(chǎn)生的額外的資源開銷。
圖1-2 標準化集裝箱前后的航運對比
使用Docker,配置工作從資源管理中分離了出來,而部署工作則不值一提:執(zhí)行docker run
,環(huán)境的鏡像會被拉取下來并準備運行,所消耗的資源更少并且是內(nèi)含的,因此不會干擾其他環(huán)境。
讀者無須擔心容器是被分發(fā)到Red Hat機器、Ubuntu機器還是CentOS虛擬機鏡像中,只要上面有Docker,就能良好地運行。
圖1-3 使用Docker前后軟件交付的對比
1.1.2 Docker有什么好處
幾個重要的實際問題出現(xiàn)了:為什么要使用Docker?Docker用在什么地方?針對“為什么”的簡要答案是:只需要一點點付出,Docker就能快速為企業(yè)節(jié)省大量金錢。部分方法(肯定不是所有的)將在隨后的幾節(jié)中討論。我們已經(jīng)在實際工作環(huán)境中切身體會到所有這些益處。
1.替代虛擬機(VM)
Docker可以在很多情況下替代虛擬機。如果用戶只關(guān)心應(yīng)用程序而不是操作系統(tǒng),可以用Docker替代虛擬機,把操作系統(tǒng)交給其他人去考慮。Docker不僅啟動速度比虛擬機快,遷移時也更為輕量,同時得益于它的分層文件系統(tǒng),與其他人共享變更時更簡單、更快捷。而且,它牢牢地扎根在命令行中,非常適合腳本化。
2.軟件原型
如果想快速體驗軟件,同時避免干擾目前的設(shè)置或配備一臺虛擬機帶來的麻煩,Docker可以在幾毫秒內(nèi)提供一個沙盒環(huán)境。在親身體驗之前,用戶很難感受到這種解放的效果。
3.打包軟件
因為對Linux用戶而言,Docker鏡像實際上沒有依賴,所以非常適合用于打包軟件。用戶可以構(gòu)建鏡像,并確保它可以運行在任何現(xiàn)代Linux機器上——就像Java一樣,但不需要JVM。
4.讓微服務(wù)架構(gòu)成為可能
Docker 有助于將一個復(fù)雜系統(tǒng)分解成一系列可組合的部分,這讓用戶可以用更離散的方式來思考其服務(wù)。用戶可以在不影響全局的前提下重組軟件,使其各部分更易于管理和可插拔。
5.網(wǎng)絡(luò)建模
由于可以在一臺機器上啟動數(shù)百個(甚至數(shù)千個)相互隔離的容器,因此對網(wǎng)絡(luò)進行建模輕而易舉。這對于現(xiàn)實世界場景的測試非常有用,而且所費無幾。
6.離線時啟用全棧生產(chǎn)力
因為可以將系統(tǒng)的所有部分捆綁在Docker容器中,所以用戶可以將其編排運行在筆記本電腦中移動辦公,即便在離線時也毫無問題。
7.降低調(diào)試支出
不同團隊之間關(guān)于軟件交付的復(fù)雜談判在業(yè)內(nèi)司空見慣。我們親身經(jīng)歷過不計其數(shù)的這類討論:失效的庫、有問題的依賴、更新被錯誤實施或是執(zhí)行順序有誤,甚至可能根本沒執(zhí)行以及無法重現(xiàn)的錯誤等。估計讀者也遇到過這些問題。Docker讓用戶可以清晰地說明(即便是以腳本的形式)在一個屬性已知的系統(tǒng)上調(diào)試問題的步驟,錯誤和環(huán)境重現(xiàn)變得更簡單,而且通常與所提供的宿主機環(huán)境是分離的。
8.文檔化軟件依賴及接觸點
通過使用結(jié)構(gòu)化方式構(gòu)建鏡像,為遷移到不同環(huán)境做好準備,Docker 強制用戶從一個基本出發(fā)點開始明確地記錄軟件依賴。即使用戶不打算在所有地方都使用Docker,這種文檔記錄也有助于在其他地方安裝軟件。
9.啟用持續(xù)交付
持續(xù)交付(continuous delivery,CD)是一個基于流水線的軟件交付范型,該流水線通過一個自動化(或半自動化)流程在每次變動時重新構(gòu)建系統(tǒng)然后交付到生產(chǎn)環(huán)境中。
因為用戶可以更準確地控制構(gòu)建環(huán)境的狀態(tài),Docker 構(gòu)建比傳統(tǒng)軟件構(gòu)建方法更具有可重現(xiàn)性和可復(fù)制性。使持續(xù)交付的實現(xiàn)變得更容易。通過實現(xiàn)一個以Docker為中心的可重現(xiàn)的構(gòu)建過程,標準的持續(xù)交付技術(shù),如藍/綠部署(blue/green deployment,在生產(chǎn)環(huán)境中維護“生產(chǎn)”和“最新”部署)和鳳凰部署(phoenix deployment,每次發(fā)布時都重新構(gòu)建整個系統(tǒng))變得很簡單。
現(xiàn)在,我們對Docker如何能夠提供幫助有了一定了解。在進入一個真實示例之前,讓我們來了解幾個核心概念。
1.1.3 關(guān)鍵的概念
在本節(jié)中,我們將介紹一些關(guān)鍵的Docker概念,如圖1-4所示。
圖1-4 Docker的核心概念
在開始執(zhí)行Docker命令之前,將鏡像、容器及層的概念牢記于心是極其有用的。簡而言之,容器運行著由鏡像定義的系統(tǒng)。這些鏡像由一個或多個層(或差異集)加上一些Docker的元數(shù)據(jù)組成。
讓我們來看一些核心的Docker命令。我們將把鏡像轉(zhuǎn)變成容器,修改它們,并添加層到我們即將提交的新鏡像中。如果這一切聽上去有點兒混亂,不用太擔心。在本章結(jié)束時,一切都將更加清晰。
1.關(guān)鍵的Docker命令
Docker的中心功能是構(gòu)建、分發(fā)及在任何具有Docker的地方運行軟件。對終端用戶而言,Docker是他們運行的一個命令行程序。就像Git(或任何源代碼控制工具)一樣,這個程序具有用于執(zhí)行不同操作的子命令。表1-1中列出了將在宿主機上使用的主要的Docker子命令。
表1-1 Docker子命令

2.鏡像與容器
如果讀者不熟悉Docker,可能這是第一次聽說本書所說的“容器”和“鏡像”這兩個詞。它們很可能是Docker中最重要的概念,因此有必要花點兒時間明確其差異。在圖1-5中,讀者將看到這些概念的展示,里面是從一個基礎(chǔ)鏡像啟動的3個容器。
圖1-5 Docker鏡像與容器
看待鏡像和容器的一種方式是將它們類比成程序與進程。一個進程可以視為一個“被執(zhí)行的應(yīng)用程序”,同樣,一個Docker容器可以視為一個運行中的Docker鏡像。
如果讀者熟悉面向?qū)ο笤恚创R像和容器的另一種方法是將鏡像看作類而將容器看作對象。對象是類的具體實例,同樣,容器是鏡像的實例。用戶可以從單個鏡像創(chuàng)建多個容器,就像對象一樣,它們之間全都是相互隔離的。不論用戶在對象內(nèi)修改了什么,都不會影響類的定義——它們從根本上就是不同的東西。
- Kubernetes修煉手冊
- 每天5分鐘玩轉(zhuǎn)Kubernetes
- Haskell Financial Data Modeling and Predictive Analytics
- 曝光:Linux企業(yè)運維實戰(zhàn)
- 數(shù)據(jù)中心系統(tǒng)工程及應(yīng)用
- 新手學電腦從入門到精通(Windows 10+Office 2016版)
- STM32庫開發(fā)實戰(zhàn)指南:基于STM32F4
- Fedora 12 Linux應(yīng)用基礎(chǔ)
- 分布式高可用架構(gòu)之道
- HTML5 Enterprise Application Development
- OpenVZ Essentials
- Windows 8玩全不求人
- 數(shù)字系統(tǒng)設(shè)計與VHDL
- 構(gòu)建高可用Linux服務(wù)器
- 電腦辦公(Windows 10+Office 2016)從入門到精通