系列目錄
Docker從零到集群(1/3)—Machine,Compose,Swarm
Docker從零到集群(2/3)—Machine,Compose,Swarm
Docker從零到集群(3/3)—Machine,Compose,Swarm
前言
Docker,容器,看似迷你微小的身軀,卻是蘊(yùn)含著龐大的智慧。它的出現(xiàn)去除了復(fù)雜的配置,改變了繁瑣的運(yùn)維,解放了冗余的環(huán)境,讓大規(guī)模的高擴(kuò)展,高可用的集群部署成為一件并不復(fù)雜的事情。
這一篇文章,會(huì)盡可能用簡(jiǎn)單易懂的敘述和快速便捷的操作講解從編寫(xiě)代碼到將其部署在一個(gè)可隨意擴(kuò)展的集群上。國(guó)內(nèi)相關(guān)的資料實(shí)在是太少了,許多的構(gòu)建指南和教程不是太老就是不完整,初學(xué)者很難以入門,尤其是swarm的集群部分,大量的概念沒(méi)有講解清除造成了極大的門檻
我希望這一篇文章是能夠真正涵蓋Docker的所有核心,也希望所有有心的讀者能夠借此踏入微服務(wù)集群領(lǐng)域,嘗試著與傳統(tǒng)單體大型應(yīng)用開(kāi)發(fā)或者傳統(tǒng)分布式應(yīng)用開(kāi)發(fā)不一樣的路
概念
話不多說(shuō),直接先進(jìn)入Docker的核心概念說(shuō)明,Docker與其三劍客分別是:
- Docker(Image/Container/Registry)
- Docker Machine
- Docker Compose
- Docker Swarm
掌握以上四個(gè)Docker核心,就可以完成從代碼到集群的部署,不過(guò)看似簡(jiǎn)單,學(xué)習(xí)起來(lái)其實(shí)還是有一些曲線的,我自己總結(jié)了許久,以下的學(xué)習(xí)路線也許入門會(huì)比較輕松
總覽
Docker(Image/Container/Registry)
首先是Docker的3個(gè)最基本的核心概念,基礎(chǔ)中的基礎(chǔ),那就是Image鏡像,Container容器,Registry倉(cāng)庫(kù)。
Image鏡像的概念就是容器運(yùn)行時(shí)需要的所有程序,文件,參數(shù)等的集合體,每一個(gè)鏡像可以理解為一個(gè)應(yīng)用程序的完整體。
Container容器的概念就是運(yùn)行起來(lái)的鏡像。說(shuō)到這里,我們其實(shí)可以對(duì)比程序和進(jìn)程的概念,程序是存儲(chǔ)在硬盤上的文件,所謂進(jìn)程就是被加載內(nèi)存里運(yùn)行的程序。鏡像和容器是一個(gè)道理,沒(méi)有什么深?yuàn)W的
Registry倉(cāng)庫(kù)的概念就是鏡像的集合,倉(cāng)庫(kù)里每個(gè)鏡像都可以有自己的標(biāo)簽,版本等,通過(guò)倉(cāng)庫(kù),就可以很輕松下載需要的鏡像
好的,說(shuō)到這里,可以串起來(lái)講一下Docker的概念,Docker其實(shí)并不是傳統(tǒng)意義上的虛擬機(jī), 它并不是在宿主機(jī)上新建立一個(gè)虛擬機(jī)。Docker之所以能類似虛擬機(jī)一樣有隔離獨(dú)立操作系統(tǒng)空間,根本上因?yàn)長(zhǎng)inux內(nèi)核支持的隔離技術(shù)(在此不展開(kāi),操作系統(tǒng)內(nèi)核技術(shù)不在本文討論范圍內(nèi)),所以非Linux系統(tǒng),都是沒(méi)有辦法直接運(yùn)行Docker的,只能通過(guò)其他辦法中轉(zhuǎn)
可以說(shuō)也是因?yàn)镈ocker吧,Linux的地位可謂是又上了一層樓,學(xué)習(xí)Docker最好的辦法是用Linux系統(tǒng),當(dāng)然Windows和Mac OS X也可以,就是需要安裝其他工具輔助運(yùn)行
最后再說(shuō)一下Docker本身的文件系統(tǒng)是分層的,當(dāng)你下載了一個(gè)基礎(chǔ)鏡像后,對(duì)這個(gè)鏡像進(jìn)行安裝工具,應(yīng)用,或者是設(shè)置環(huán)境變量等等,其實(shí)都是在這個(gè)鏡像的基礎(chǔ)進(jìn)行增量文件寫(xiě)入。這也就解釋了很多人的困惑,為什么一個(gè)linux系統(tǒng)再小也得好幾百M(fèi)B,甚至上幾GB的大小,但是有時(shí)候一個(gè)Docker的操作系統(tǒng)鏡像才幾十MB甚至十幾MB。因?yàn)镈ocker的鏡像并不是完整的操作系統(tǒng)鏡像,并不會(huì)包含操作系統(tǒng)所有的文件。Docker使用的都是Linux的內(nèi)核,不同的Linux發(fā)行版本用的也都是Linux內(nèi)核,只是安裝的軟件工具不同而已。所以不同的Docker操作系統(tǒng)鏡像,其本質(zhì)的不同就是他們的Dockerfile上的安裝軟件工具的不同
Docker Machine
很多人會(huì)把Docker Machine和Docker弄混,其實(shí)Docker Machine只是安裝Docker環(huán)境的工具,而且這就真的是一個(gè)虛擬機(jī)工具了。因?yàn)椴煌腖inux發(fā)行版太多了,而且還有Windows和Mac OS X等操作系統(tǒng),要是大量不同機(jī)器,而且操作系統(tǒng)參次不齊,那光是安裝Docker就足夠累死了。所以Docker Machine應(yīng)運(yùn)而生,Docker Machine可以通過(guò)命令快速創(chuàng)建帶有Docker環(huán)境的虛擬機(jī),然后在這個(gè)虛擬機(jī)里面,就可以快速地部署Docker容器了
Docker Compose
如果說(shuō)Docker是應(yīng)用環(huán)境安裝腳本的集合,那么Dcoker Compose就是Docker啟動(dòng)運(yùn)行腳本的集合,因?yàn)槭褂肈ocker命令定制化地啟動(dòng)一個(gè)鏡像容器,命令很長(zhǎng)而且不好記憶,每個(gè)容器都要輸入命令也繁瑣,容器數(shù)量一大,會(huì)累死,所以Docker Compose就誕生了,一個(gè)yml的腳本文件,就搞定
Docker Swarm
通過(guò)Docker Machine我們創(chuàng)建啟動(dòng)了帶有Docker環(huán)境的虛擬機(jī),然后通過(guò)Docker Compose我們?cè)谔摂M機(jī)上啟動(dòng)運(yùn)行了Dcoker,但是這些都僅僅是啟動(dòng)運(yùn)行了一個(gè)鏡像容器,和傳統(tǒng)單機(jī)應(yīng)用也沒(méi)啥區(qū)別,而且傳統(tǒng)的好像也沒(méi)這么麻煩。這時(shí)候,Docker的終極目標(biāo)Docker Swarm就上場(chǎng)了,通過(guò)Docker Swarm,就可以通過(guò)僅僅幾個(gè)命令將大量的機(jī)器創(chuàng)建成一個(gè)集群,然后在這個(gè)集群里面的每臺(tái)機(jī)器上都運(yùn)行部署指定的鏡像容器!所有的鏡像容器組成的集群,對(duì)外就像一臺(tái)機(jī)器一樣,沒(méi)有任何區(qū)別,全自動(dòng)的負(fù)載均衡,全自動(dòng)的容災(zāi)處理。這一些以前需要專業(yè)運(yùn)維團(tuán)隊(duì)長(zhǎng)時(shí)間工作才能完成的事情,如今一個(gè)人一天就可以完成,而且非常輕松!這是傳統(tǒng)單機(jī)應(yīng)用甚至是傳統(tǒng)分布式應(yīng)用無(wú)法匹及的,所以Docker為微服務(wù)架構(gòu)打下基礎(chǔ),引領(lǐng)新一輪軟件工程革命是毫不夸張的
后記
以上就是Docker的核心概念,將其所有概念串起來(lái),我們可以得到從零開(kāi)始到構(gòu)建一個(gè)集群系統(tǒng)的基本思路:
通過(guò)Docker將應(yīng)用的運(yùn)行環(huán)境,和代碼本身打包成為一個(gè)完整的鏡像(Image)
通過(guò)容器(Container)運(yùn)行生成的鏡像,就相當(dāng)于運(yùn)行了應(yīng)用
通過(guò)上傳生成的鏡像到倉(cāng)庫(kù)(Registry),可以云端持久化鏡像,在我們需要的時(shí)候下載以容器運(yùn)行,就可以得到了一個(gè)理論上能在任何系統(tǒng)運(yùn)行的應(yīng)用體,無(wú)須關(guān)心任何的配置和環(huán)境,一次構(gòu)建,隨處運(yùn)行
通過(guò)以上步驟,我們可以得到一個(gè)存儲(chǔ)在云端,能隨時(shí)下載運(yùn)行的鏡像,但是通過(guò)Docker的命令參數(shù)運(yùn)行容器,是比較冗余麻煩的,尤其是在容器數(shù)量比較多的情況下。這時(shí)候我們需要利用Docker Comopse編寫(xiě)一個(gè)yml文件,使用一個(gè)簡(jiǎn)單的命令執(zhí)行這個(gè)配置文件,我們則可以迅速運(yùn)行yml文件所有配置好的所有容器服務(wù)
因?yàn)镈ocker的安裝在不同的系統(tǒng)安裝不同,為了簡(jiǎn)化Docker環(huán)境的部署,引入Dokcer Machine,通過(guò)它創(chuàng)建一個(gè)帶有Docker環(huán)境的虛擬機(jī),在這個(gè)虛擬機(jī)里可以直接使用Dokcer
通過(guò)以上,我們完成了單機(jī)Dokcer配置運(yùn)行所有的工作,我們可以完美地在單機(jī)上創(chuàng)建部署運(yùn)行多個(gè)容器,讓其相互關(guān)聯(lián)工作。但是單機(jī)應(yīng)用在訪問(wèn)量大時(shí),是無(wú)法支撐的。這個(gè)時(shí)候我們就需要通過(guò)Docker Swarm,將多臺(tái)主機(jī)組成一個(gè)集群,然后創(chuàng)建可伸縮的服務(wù),每個(gè)服務(wù)的基礎(chǔ)是一個(gè)鏡像容器,這個(gè)服務(wù)會(huì)根據(jù)設(shè)定好的數(shù)量,自動(dòng)分發(fā)到每臺(tái)服務(wù)主機(jī)上,且數(shù)量可隨意調(diào)節(jié)。不同的主機(jī)會(huì)被構(gòu)建在一個(gè)網(wǎng)絡(luò)中,對(duì)外部而言,就像是一臺(tái)主機(jī)一樣,集群會(huì)自動(dòng)負(fù)載均衡
后續(xù)
至此,就是Docker構(gòu)建集群的基本思路,限于篇幅,本文只闡述Docker的核心概念和簡(jiǎn)單說(shuō)明集群的構(gòu)建思路。整個(gè)Docker系列文章預(yù)計(jì)會(huì)有三篇,后續(xù)兩篇會(huì)一步步闡述如何真實(shí)構(gòu)建單機(jī)Docker應(yīng)用系統(tǒng)和如何構(gòu)建一個(gè)可伸縮的Dokcer集群系統(tǒng),所以,未完待續(xù)...
感謝你的閱讀,希望本文能夠給你帶來(lái)幫助
作者:CheneyXu
關(guān)于:XServer官網(wǎng)