脈沖云的部署管理和集群管理底層基于Docker實現(xiàn),本文就來簡單了解一下Docker。
其實脈沖云對底層技術(shù)做了很好的封裝,你只需要了解到代碼中的Dockerfile能構(gòu)建成鏡像,鏡像保存在脈沖云的鏡像倉庫中,部署管理能將鏡像部署到你的服務(wù)器節(jié)點上,然后你能在線查看應(yīng)用的運行狀態(tài)、控制啟停,這就夠了。
對Docker的了解,能讀懂下圖也就夠了,圖中有五個對象:鏡像、容器、鏡像倉庫、備份文件、Dockerfile,并且有多個藍(lán)色字體標(biāo)出的命令,用來將各種對象互相轉(zhuǎn)換、生成,接下來一一介紹:

鏡像
你可以簡單理解鏡像是一個壓縮包,這個包中,有你的程序或代碼,還有一個文件系統(tǒng),所謂文件系統(tǒng),就是打包了一個標(biāo)準(zhǔn)操作系統(tǒng)的所有必須文件,可執(zhí)行程序、運行庫等。
Docker之所以解決了程序執(zhí)行環(huán)境一致性問題,就是將應(yīng)用程序和文件系統(tǒng)打包到了一起,程序運行時,從你打包的鏡像文件系統(tǒng)中加載依賴,比如,你的程序依賴JDK 1.8,那么將鏡像中打包上JDK1.8的基礎(chǔ)庫,然后無論將鏡像部署到何種環(huán)境的系統(tǒng)上,無論那臺主機(jī)是否安裝了JDK,或安裝了任意版本的JDK,你的應(yīng)用程序啟動時,都能一致性地加載鏡像中的JDK1.8,避免了因環(huán)境不統(tǒng)一造成的部署難題和運行時BUG。
可以通過ID或名稱識別鏡像,ID是SHA256格式的HASH值,例如:
b1183dab1c4049b9b9d0d0dff17d2eb04e8d9caf873f7ff505ff9fe8909e2a48
可以簡寫做?b1183dab1c40
鏡像名稱分為鏡像名和Tag兩部分組成,中間以冒號分別,如果Tag省略,則代表latest,比如:
# Docker官方鏡像,省略了 Tag
ubuntu
# Docker官方鏡像,指定Tag
ubuntu:16.04
# Docker Hub上非Docker官方的鏡像
maichong/ubuntu:16.04
# 脈沖云倉庫中的鏡像,帶鏡像倉庫地址
maichong.io/project/ubuntu:16.04
可以使用?docker tag?命令給已經(jīng)存在的鏡像打上一個新標(biāo)簽,比如:
# 給 ubuntu:16.04 增加一個新標(biāo)簽 maichong.io/project/ubuntu:16.04
docker tag ubuntu:16.04 maichong.io/project/ubuntu:16.04
查看當(dāng)前系統(tǒng)中所有的鏡像列表:
> docker images
REPOSITORY? ? ? ? TAG? ? ? ? ? ? IMAGE ID? ? ? ? CREATED? ? ? ? ? ? SIZE
ubuntu? ? ? ? ? ? 16.04? ? ? ? e13f3d529b1a? ? 6 days ago? ? ? ? 115MB
容器
可以簡單理解鏡像是“死的”,是磁盤上儲存的“靜態(tài)的”文件,而容器,則是運行起來的、內(nèi)存中的、“動態(tài)的”實例。當(dāng)然,容器不一定是運行著的,容器也能停止。
通過?docker run?命令可以從一個鏡像啟動一個容器,一個鏡像可以啟動無限個容器副本,每個容器還互相隔離,可以將一個個容器理解成一個個虛擬機(jī),每個容器都有自己的IP、文件系統(tǒng)等等。
和虛擬機(jī)相比,容器運行時雖然網(wǎng)絡(luò)、文件等資源是隔離的,但是共享主機(jī)的內(nèi)核,即,Docker沒有為每個容器都從頭啟動內(nèi)核,而是在當(dāng)前主機(jī)系統(tǒng)的內(nèi)核中運行容器中的程序,這相對于VM虛擬機(jī)有非常大的性能優(yōu)勢,所以稱Docker為輕量虛擬化。
可以通過?docker start?/?docker stop?/?docker restart?控制容器的啟動、停止、重啟。
運行docker commit命令可以將正在運行的容器生成一個新版本的鏡像,但是推薦使用Dockerfile生成鏡像。
Dockerfile
簡言之,Dockerfile是生成鏡像的配置文件,例如:
# 指定tomcat版本
FROMtomcat:8.5.32-jre8
# 指定工作目錄
WORKDIR /app
# 將打包后的 server.jar 拷貝到鏡像中
# 可以使用脈沖云的編譯構(gòu)建服務(wù),在線將源碼打包成 jar
ADDserver.jar /app/server.jar
# 設(shè)置鏡像的啟動命令
CMDjava -jar /app/server.jar
# 聲明需要監(jiān)聽的端口
EXPOSE8080
該文件中首先聲明了鏡像的基礎(chǔ)鏡像,一般情況下,你構(gòu)建的鏡像需要依賴一個基礎(chǔ)鏡像,就像你在一個電腦上安裝軟件的前提是這個電腦已經(jīng)有了一個操作系統(tǒng)。
然后Dockerfile中記錄著生成新鏡像的一個個步驟,包括拷貝文件、執(zhí)行命令等。
Dockerfile中還包含著一些其他信息的聲明,比如環(huán)境變量、標(biāo)注需要開放的端口等。
使用docker build?命令,可以依照Dockerfile中記錄的步驟,一步步生成新的鏡像。
在正在運行的容器內(nèi)執(zhí)行一個個命令,安裝一個個軟件,然后運行 docker commit 也能生成一個新的鏡像,但是請不要這樣操作。因為,使用Dockerfile可以記錄下來鏡像的生成過程,并且能夠隨時調(diào)整其中的步驟,重新生成鏡像。這就是傳說中的基礎(chǔ)設(shè)施即代碼,將基礎(chǔ)環(huán)境的配置當(dāng)做軟件編程來進(jìn)行。
備份文件
可以使用?docker save?命令,將你電腦上生成的鏡像導(dǎo)出成tar打包文件,然后用來數(shù)據(jù)備份,或?qū)⑽募截惖狡渌娔X上,用docker load?命令導(dǎo)入鏡像,實現(xiàn)鏡像的分發(fā)。
但是,這樣操作非常麻煩,尤其是遠(yuǎn)程傳輸。請使用鏡像倉庫來進(jìn)行統(tǒng)一管理和分發(fā)。
鏡像倉庫
鏡像倉庫就是一個在線提供鏡像存儲的服務(wù)。使用?docker pull?從鏡像倉庫中拉?。ㄏ螺d)鏡像,使用?docker push?命令將本地鏡像推送(上傳)到鏡像倉庫中。
通常我們所有用到的鏡像都來自Docker官方倉庫?http://hub.docker.com?,對于企業(yè)用戶,脈沖云也提供了企業(yè)私有鏡像倉庫,你必須擁有指定項目的權(quán)限,并且通過?docker login maichong.io?登錄后才能向脈沖云中推拉鏡像。
最后,作為普通開發(fā)者,脈沖云不要求記住全部的Docker概念和命令,只需要會編寫Dockerfile配置應(yīng)用程序的環(huán)境即可,我們下一節(jié)繼續(xù)介紹如何編寫Dockerfile。