?

在我國(guó)古代,傳說(shuō)天庭中有種種天兵天將,有看守四大天門的(docker0網(wǎng)橋),有負(fù)責(zé)傳話的門將(REST API),有負(fù)責(zé)人間和天界聯(lián)絡(luò)的,如財(cái)神爺,土地公等(NAT,DNS),而且還有綁定在每個(gè)神仙身上的坐騎(EVS,NFS,BS,? EFS),還有關(guān)于各個(gè)管轄的奏折(Log)。由于每個(gè)上仙的職責(zé)不同(Controller,Scheduler),被管轄范圍的人數(shù)或者項(xiàng)目不同(Container,Host),還有吃了可以長(zhǎng)命百歲的仙桃(image)等等等等;但是呢,天庭有個(gè)規(guī),不許神仙與凡人相愛,而處于修道或者成魔成妖的人或者動(dòng)物,則屬于被監(jiān)控和被調(diào)度的資源。
? ? 原來(lái)古代的管理模式也屬于云計(jì)算的范疇,即通過(guò)一個(gè)請(qǐng)求可以將計(jì)算資源,存儲(chǔ)資源,網(wǎng)絡(luò)資源進(jìn)行調(diào)度、分配與整合。
牛郎:
? ? 牛郎是一個(gè)很聰明,很樸實(shí),很簡(jiǎn)單的語(yǔ)言,他所處的世代(runtime)是一個(gè)多帝王(CPU),多耕地(Disk),嚴(yán)制度(Gc),快通訊(Goutinue)的朝代。也正是就這樣,天時(shí)地利人和,樣樣是牛郎的優(yōu)勢(shì),于是乎牛郎(Go)就誕生在世人的眼簾。由于k8s的組件多數(shù)是基于go開發(fā)的,再加上牛郎自的優(yōu)勢(shì),而他的貢獻(xiàn)很快被世人所應(yīng)用,大致有這幾個(gè)特點(diǎn):
? ? 1、部署簡(jiǎn)單;相比Python,Python官方 PyPI 源又經(jīng)常出問(wèn)題,需要搭建私有鏡像,而維護(hù)這個(gè)鏡像又要花費(fèi)不少時(shí)間和精力,而go語(yǔ)言可編譯可執(zhí)行的靜態(tài)文件,除了 glibc 外沒(méi)有其他外部依賴。
? ? 2、效率之快;相比Java,它完善的基礎(chǔ)庫(kù)和的和高效gc,相比C語(yǔ)言,雖然C和C++有超快的處理速度和強(qiáng)大的性能,但是這兩個(gè)者對(duì)字符串處理能力較弱,也沒(méi)有g(shù)c,導(dǎo)致開發(fā)周期提升。
? ? 3、并發(fā)性好;Goroutine和channel 使得編寫高并發(fā)的服務(wù)端軟件變得相當(dāng)容易,很多情況下完全不需要考慮鎖機(jī)制以及由此帶來(lái)的各種問(wèn)題。單個(gè) Go 應(yīng)用也能有效的利用多個(gè) CPU 核,并行執(zhí)行的性能好。
? ? 4、良好的語(yǔ)言設(shè)計(jì);定義變量自由,切片和接口的設(shè)計(jì)大大提高了代碼的通用性和移植能力。比如 gofmt 自動(dòng)排版 Go 代碼,很大程度上杜絕了不同人寫的代碼排版風(fēng)格不一致的問(wèn)題。
? ? 而民間傳說(shuō)有一件法寶名叫beego框架,它正是借助牛郎的優(yōu)勢(shì)所發(fā)明出來(lái)的一件器皿。而它的出現(xiàn)大大簡(jiǎn)化耕地(程序)和農(nóng)場(chǎng)(web項(xiàng)目)的開發(fā)的周期和流程設(shè)計(jì),起初只需要按照生成模板進(jìn)行增刪改,就可以快速創(chuàng)建和部署一個(gè)小型農(nóng)場(chǎng)。
? ? 要先獲取此件寶器,必須先去github官網(wǎng)下載源碼,進(jìn)行編譯,然后搭建好bee和beego的環(huán)境,搭建好之后通過(guò)如下寶器的咒語(yǔ)創(chuàng)建beego項(xiàng)目,比如下面命令就可以創(chuàng)建項(xiàng)目:
bee new hello
? ? 創(chuàng)建好項(xiàng)目之后,便可以給耕地種植不同種類的農(nóng)作物,就可以讓其生長(zhǎng),如下圖所示的目錄結(jié)構(gòu)是我這個(gè)窮屌絲的農(nóng)場(chǎng)結(jié)構(gòu),簡(jiǎn)單的國(guó)際化處理,特別簡(jiǎn)陋,希望大家熟練去應(yīng)用牛郎的貢獻(xiàn)。

織女(Docker):
? ? 在云計(jì)算中,也就是在天界中,織女Docker就好比集裝箱,天界就好比大貨輪。Mac上的Docker好比煙熏妝的織女,深沉而又優(yōu)雅。
? ? “在集裝箱之前,貨物運(yùn)輸沒(méi)有統(tǒng)一的標(biāo)準(zhǔn)方式進(jìn)行搬運(yùn),于是鐵路、公路、海洋等各種運(yùn)輸之間,需要大量的人力作為貨物中轉(zhuǎn),效率極低,而且成本很高。集裝箱出現(xiàn)之后,世界上絕大多數(shù)的貨物運(yùn)輸都可以放到這個(gè)神奇的箱子里,然后在公路、鐵路、海洋等所有運(yùn)輸場(chǎng)景下,這個(gè)箱子都可以不用變化形態(tài)直接可以承運(yùn),而且中間的中轉(zhuǎn)工作,都可以通過(guò)大型機(jī)械搞定,效率大大提升”。引自騰訊高級(jí)工程師鄒立巍在《什么是 Docker?》這篇文章的上半部分對(duì)Docker的通俗解釋;
? ? 正是由于標(biāo)準(zhǔn)貨輪的出現(xiàn),大大推動(dòng)了云概念的進(jìn)階和天庭的改革。隨著docker對(duì)天界的應(yīng)想呈遞增式增長(zhǎng),而且關(guān)于它的奏章目前也不少,每個(gè)上仙團(tuán)隊(duì)對(duì)docker的關(guān)注點(diǎn)也并不相同,這個(gè)得結(jié)合自己的應(yīng)用去使用“集裝箱”。
? ? 織女Docker常見有三重性格:即MacOS、Linux/Unbutu、Windows,它們的安裝步驟分別在下篇文章中可進(jìn)行閱覽,包括內(nèi)容有織女Docker的命令、存儲(chǔ)和網(wǎng)絡(luò)等。
鵲橋(Dockerfile):
? ? 每當(dāng)牛郎(Go)和織女(Docker)相遇,一見鐘情。而最后被王母(OS)經(jīng)常阻攔或者拆散。但是他們十分相愛以至于感動(dòng)了世間萬(wàn)物,即鏡像的出現(xiàn)拉近了彼此之間的距離,推動(dòng)了故事的進(jìn)一步發(fā)展;都說(shuō)過(guò)Docker是集裝箱的容器,容器里面放的是應(yīng)用,應(yīng)用可以是web項(xiàng)目、也可以是程序還可以是農(nóng)場(chǎng)。
有這么一句話:“Any problem in computer science can be solved by another layer of indirection”。意思是說(shuō),在計(jì)算機(jī)科學(xué)領(lǐng)域的任何問(wèn)題都可以增加一個(gè)間接的中間層來(lái)解決。
? ? 所以鵲橋的出現(xiàn)就相當(dāng)于一個(gè)中間層??椗瓺ocker通過(guò)Dockerfile構(gòu)建出來(lái)鵲橋,來(lái)加載啟動(dòng)鏡像和牛郎Go相遇,而鏡像包的制作離不開牛郎家的牛皮即壓縮好的tar包。鵲橋制作的模板如下:
FROM centos:latest
MAINTAINER nanzehua nanzehua@163.com
EXPOSE 8080
#RUN passwd paas < paas_pwd.txt
#RUN rm paas_pwd.txt
ADD hello.tgz /var/paas/project-hello/
#COPY tar -zxvf /var/paas/project-hello/hello.tgz
RUN mkdir -p /var/paas/log/
RUN touch /var/paas/log/project-hello.log
RUN chown paas:paas -R /var/paas/
RUN chmod -R 750 /var/paas/
#ENTRYPOINT ["/var/paas/project-hello"]
CMD ["/var/paas/project-hello/hello"]
? ? ADD和COPY的區(qū)別是,ADD命令會(huì)將壓縮好的tar包直接解壓到指定目錄中,然后通過(guò)docker build -t hello:1.1.1來(lái)編譯鏡像,為了提高工作效率,可以通過(guò)編寫shell腳本來(lái)構(gòu)建自動(dòng)化出包,直接用jenkins鏡像搭建CI環(huán)境,再將Go項(xiàng)目編譯二進(jìn)制文件的時(shí)候值得注意一點(diǎn)是,由于編譯環(huán)境不同,通過(guò)交叉編譯后,二進(jìn)制文件才能在指定環(huán)境中運(yùn)行,大致這三種場(chǎng)景:
# Mac下進(jìn)行交叉編譯至Linux64
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build
#bee pack -be=GOOS=linux -exs=.md:.go:.DS_Store:.tmp:.zip:.exe.exe~ -exp=.:swagger:static:runtime
# Mac下進(jìn)行交叉編譯至Windows64
CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build
CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build
# Linux下編譯
go build
? ? 這些問(wèn)題注意之后,咱們就生成了一個(gè)名為的hello的Image,然后通過(guò)
docker run -p 8080:8080 hello:1.1.1
就成功啟動(dòng)了一個(gè)容器,瀏覽器中在通過(guò)
http://127.0.0.1:8080
就可以看到beego的主界面和已經(jīng)國(guó)際化的個(gè)別字樣了,詳細(xì)的自動(dòng)化shell腳本和go代碼,我已經(jīng)上傳至github庫(kù)Docker+beego,歡迎大家的指點(diǎn)和補(bǔ)充。
? ? 下一節(jié),講解Docker網(wǎng)絡(luò)、CLI和日志。