摘要:如何用定制你自己的環(huán)境前言學(xué)習(xí)幾個月了,一直在論壇和群里潛水,一直都想寫點(diǎn)什么回報(bào)大家積極的知識分享。關(guān)于如何使用,可以參考上面的文章和官方文檔二小試牛刀,用構(gòu)建一個的環(huán)境并運(yùn)行程序首先來貼上我的先附上這個項(xiàng)目地址。
如何用Docker定制你自己的Beego環(huán)境
前言:
學(xué)習(xí)golang幾個月了,一直在論壇和qq群里潛水,一直都想寫點(diǎn)什么回報(bào)大家積極的知識分享。
前幾日在CSDN上看到了一篇文章:如何將nodeclub構(gòu)建成Docker鏡像.也對docker有所了解,就來分享一下我平時怎么應(yīng)用docker來跑我的項(xiàng)目。
一、為什么要用Docker先引用Beego作者謝大描述虛擬機(jī)的一段話:"平常我們經(jīng)常會遇到這樣的問題:在開發(fā)機(jī)上面開發(fā)完畢程序,放到正式環(huán)境之后會出現(xiàn)各種奇怪的問題:描述符少了、nginx配置不正確、MySQL編碼不對、php缺少模塊、glibc版本太低等。所以我們就需要虛擬開發(fā)環(huán)境,我們虛擬和正式環(huán)境一樣的虛擬開發(fā)環(huán)境"
但是虛擬機(jī)真的好重,虛擬機(jī)不僅啟動慢,而且浪費(fèi)很多的cpu,內(nèi)存資源,于是應(yīng)運(yùn)而生了docker,為我們提供了一個輕量級的虛擬環(huán)境。
關(guān)于docker的更多介紹資料就很多了。InfoQ的這一系列文章很值得閱讀。
關(guān)于如何使用Docker,可以參考上面nodeclub的文章和官方文檔
二、小試牛刀,用Docker構(gòu)建一個Beego的環(huán)境并運(yùn)行hello程序首先來貼上我的Dockerfile
FROM golang:1.4.2 #author MAINTAINER carl #add beego and other package ADD github.com /go/src/github.com #build bee tool script ADD build.sh /build.sh RUN chmod +x /build.sh RUN /build.sh #add bee tool to PATH ENV PATH $PATH:$GOPATH/bin #add our project ADD hello /go/src/hello #start project script ADD run.sh / RUN chmod +x /run.sh EXPOSE 8080 CMD ["/run.sh"]
先附上這個項(xiàng)目github地址。但是其中的依賴包需要自己get并且放到github.com目錄下。
我們一句一句分析:
1.FROM golang:1.4.2 這句話必須是Dockerfile的第一句話,并且指明我要用的基礎(chǔ)鏡像。這里我用的是dockerHub的官方golang:1.4.2鏡像,畢竟官方鏡像才是最值得信賴的。
2.MAINTAINER puppy 指明作者是誰,可有可無。
3.ADD github.com /go/src/github.com查閱golang:1.4.2鏡像說明我們了解到該鏡像的GOPATH是/go目錄。于是我們將提前準(zhǔn)備好的"github.com/astaxie/beego","github.com/beego/bee"包通過這條命令都加到我們的GOPATH。并且我們了解到生成 bee工具的時候需要幾個依賴包。分別是github.com/go-sql-driver/mysql、github.com/howeyc/fsnotify、github.com/lib/pq 、github.com/smartystreets/goconvey/convey、github.com/jtolds/gls。
4.ADD build.sh /build.sh 因?yàn)镈ockerfile 的RUN命令只支持linux的基本命令,而我們在生成bee工具時候需要用到go。 install,所以我們只能通過運(yùn)行腳本來生成bee工具。
5.RUN chmod +x /build.sh 為腳本賦運(yùn)行權(quán)限,也可以提前賦好權(quán)限,就不用在構(gòu)建過程中運(yùn)行這條命令了。
6.RUN /build.sh運(yùn)行腳本,構(gòu)建bee工具。
7.ENV PATH $PATH:$GOPATH/bin 將bee工具添加到環(huán)境變量里。
8.ADD hello /go/src/hello將我們的hello項(xiàng)目添加到$GOPATH下面。
9.EXPOSE 8080 啟動容器后容器暴露給外部的端口
10.CMD ["/run.sh"]CMD命令是我們在根據(jù)鏡像啟動容器后自動執(zhí)行的動作,這里我們添加了run.sh腳本,這個腳本就是用bee run 來啟動我們hello項(xiàng)目的。
通過上邊nodjs的文章了解到時速云提供了一個可以在windows下構(gòu)建鏡像的tce客戶端。
1.下載后,安裝需要配置環(huán)境變量。
2.進(jìn)入到項(xiàng)目目錄,目錄下包含了Dockerfile以及Dockerfile里需要的build.sh,run.sh,和beego需要的包文件。
3.輸入 tce push beetest就開始構(gòu)建鏡像了。簡單粗暴。
4.構(gòu)建過程中,可以查看到整個過程的日志輸出。
5.構(gòu)建完成后我們就可以進(jìn)入 官網(wǎng)-》鏡像-》我的鏡像 下找到我們剛剛構(gòu)建的鏡像了。然后就可以直接通過這個鏡像直接創(chuàng)建容器了。
6.在的容器頁下可以直接創(chuàng)建容器,省心省力。直接打開,看到我們的小 beego。
三、初步實(shí)踐,開發(fā)過程中用到docker如果是在我們平時的開發(fā)過程中,以上的方法肯定是不可取的。不然每次對代碼有一點(diǎn)點(diǎn)改動,難道就要重新構(gòu)建一個beego的鏡像么?
NO
docker好處之一就是隨時可以把想要定制化的容器隨時打包成鏡像
于是我們可以將以上的鏡像分成兩部分,讓我們的不需要經(jīng)常改動的package打成一個鏡像A,再將我們的經(jīng)常開發(fā)的代碼用之前構(gòu)建的鏡像A為base鏡像,構(gòu)建成我們常用的產(chǎn)品鏡像。
那么問題又來了
我們在寫程序的過程中,常常會引入了新的代碼包,是不是還要一并的重新構(gòu)建beego鏡像??墒俏覀冊愁惗棘F(xiàn)在趨向于解耦,當(dāng)然耦合度越低越好了。于是我們可以將此分為三層。
用golang:1.4.2鏡像構(gòu)建成的Beego鏡像mybeego
用mybeego鏡像構(gòu)建成的包含項(xiàng)目依賴的Packages的鏡像beego-package
用beego-package鏡像構(gòu)建成的包含項(xiàng)目代碼的鏡像myhello
這樣mybeego 可以提交到DockerHub作為一個公共的Beego基礎(chǔ)鏡像。 beego-package 是我們不常改動的代碼依賴環(huán)境鏡像。 myhello 是我們經(jīng)常改動的代碼鏡像。
于是可以將Dockerfile分別寫成
mybeego:v1
FROM golang:1.4.2 MAINTAINER carl ENV PATH $PATH:$GOPATH/bin ADD github.com /go/src/github.com ADD build.sh /build.sh RUN chmod +x /build.sh RUN /build.sh
beego-package:v1
FROM mybeego:v1 ADD github.com /go/src/github.com ADD golang.org /go/src/golang.org . . .
myhello:v1
ADD beego-blog /go/src/beego-blog ADD run.sh / RUN chmod +x /run.sh EXPOSE 8080 CMD ["/run.sh"]
附上Beego基礎(chǔ)鏡像的github地址。的也可以在時速云共有鏡像找到。
這樣,把模塊細(xì)化,產(chǎn)品運(yùn)行環(huán)境隔離,只要你構(gòu)建成功,并且成功跑起來了該項(xiàng)目。那么以后再也不會出現(xiàn)讓很多人頭疼的環(huán)境問題了。并且你也可以將這個鏡像打包,直接把這個鏡像在產(chǎn)品環(huán)境啟動,都是OK沒問題的,只要你的PC裝了docker就可以。
四、懶人絕招、鏡像都懶得構(gòu)建我就是個懶人,本來windows是安裝不了docker的,但是懶得開虛擬機(jī),所以用了時速云這個客戶端。以上做法都已經(jīng)很簡便開發(fā)了,但是每次構(gòu)建還都需要重新構(gòu)建一個鏡像,雖然步驟簡單,但是也很讓人煩。
有沒有不用每次構(gòu)建鏡像就可以開發(fā)的方法么?
當(dāng)然有!
但是你必須是在linux環(huán)境下。我們應(yīng)用的是Docker -v命令, volume映射的方法。
首先要小小改動一下我們代碼的Dockerfile
myhello:v1
ADD run.sh / RUN chmod +x /run.sh EXPOSE 8080 CMD ["/run.sh"]
對比發(fā)現(xiàn),只是把ADD beego-blog $GOPATH/src/beego-blog這句話去掉了。
然后用docker命令來啟動容器 sudo docker run -p 8006:8080 -v /root/beego-blog:/go/src/beego-blog myhello:v1
-p 命令是端口映射,后面的端口8080是容器暴露出來的端口,前面的8006是對應(yīng)我們host宿主機(jī)的端口。
-v 命令是文件映射的命令,通過以上的命令,將宿主機(jī)的/root/beego-blog文件夾,映射到了$GOPATH/src/beego-blog文件夾。其中要注意的是-v后參數(shù) 前面的是host宿主機(jī)路徑,后面是容器路徑,并且路徑都必須是絕對路徑。
啟動容器后,你就可以訪問localhost:8006來訪問我們的myhello程序了。如果你對代碼有了改動。將會自動同步到容器內(nèi)部,只需要docker restart container_id 就可以了。(其實(shí)如果你run.sh里的啟動方式是bee run,當(dāng)然代碼會自動重新運(yùn)行的)。
是不是非???!這樣來說既沒有了各種環(huán)境問題帶來的困擾,又可以輕松編寫構(gòu)建代碼了。最重要的是你不需要再為了遷移部署到其他地方再搭一遍環(huán)境了。
五、個人體會、取之于docker,用之于docker個人來說,學(xué)習(xí)go語言幾個月了,期間也看了一些docker。docker就是go語言的一個精良產(chǎn)物,并且圍繞docker的很多工具也都是用go來寫的,看著心里就有一種大go要崛起的趕腳。
平時在工作的時候,有時候在測試機(jī)上要跑個簡單的go程序,但是發(fā)現(xiàn)沒有g(shù)o環(huán)境,裝環(huán)境還煩,恰好機(jī)器上有docker。隨便寫個Dockerfile。用命令 docker run -ti myimage /bin/bash就跑到容器里去調(diào)程序,當(dāng)時的真的感覺"這東西咋這么方便呢",如果你要弄個php,ruby這些都不用去弄環(huán)境了,直接容器里就都有了,用著真的很方便。
在說說我在時速云上一點(diǎn)點(diǎn)發(fā)現(xiàn)。在他們的鏡像區(qū)里的公有鏡像有好多新奇的發(fā)現(xiàn)。其中發(fā)現(xiàn)一個的Discuz鏡像,出于好奇,我建了一個discuz容器和mysql容器。
然后就直接裝上了這個discuz,并且可以直接當(dāng)做管理員來各種拖拽玩了。還是挺有意思的。通過這些來看,docker確實(shí)為我們帶來了很多便利,即使不懂技術(shù),可以根本不會部署各種環(huán)境,但是只要會用linux系統(tǒng)就可以從頭到尾維護(hù)一個社區(qū)網(wǎng)站了,甚至是做更多用處了。
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/26436.html
摘要:現(xiàn)在是時候使用安裝一個多節(jié)點(diǎn)和了。容器的容器是無狀態(tài)的,重復(fù)運(yùn)行將清除保存在容器內(nèi)數(shù)據(jù)。這個安裝程序只支持。空容器啟動后,我們調(diào)用,依次進(jìn)行,下載安裝并配置。這是必要的,有兩個原因。 現(xiàn)在是時候使用Docker安裝一個多節(jié)點(diǎn)Codenvy On-Prem和Eclipse Che了。 Docker容器包裝一塊軟件到一個文件系統(tǒng),這里面包含一切它運(yùn)行的要素:code, runtime, s...
摘要:今天,小編給大家分享大會第二期干貨。田琪深入理解容器技術(shù)首先大家肯定要清楚容器和的本質(zhì)區(qū)別,通過內(nèi)核提供的這個東西,能夠讓你完成進(jìn)程級別的隔離的效果。 showImg(http://sharlyne-lee.qiniudn.com/ecug2.png); 今天,小編給大家分享ECUG Con 2014大會第二期干貨。 下面是田琪(京東資深架構(gòu)師)、何全(多備份技術(shù)總監(jiān))、馬全一(d...
摘要:簡單理解一個完整的調(diào)用鏈包含無限極分類追蹤對象,一個代表了一個服務(wù)或者流程在系統(tǒng)中的執(zhí)行過程,如,,等執(zhí)行過程。無限極分類服務(wù)與服務(wù)之間使用無限極分類的方式,通過頭部或者請求地址傳輸?shù)阶畹蛯樱瑥亩颜麄€調(diào)用鏈串起來。 showImg(https://segmentfault.com/img/remote/1460000011636962?w=2239&h=1202); 原文:Uber分...
摘要:用于配置當(dāng)前所創(chuàng)建的鏡像作為其它新創(chuàng)建鏡像的基礎(chǔ)鏡像時,所執(zhí)行的操作指令。運(yùn)行構(gòu)建命令構(gòu)建命令用于使用創(chuàng)建鏡像。 本文旨在用通俗的語言講述枯燥的知識 前面講到鏡像的構(gòu)建時,講述的是用commit的方式構(gòu)建鏡像,而Dockerfile是另一種構(gòu)建鏡像的方式。 Dockerfile構(gòu)建鏡像是以基礎(chǔ)鏡像為基礎(chǔ)的,Dockerfile是一個文本文件,內(nèi)容是用戶編寫的一些docker指令,每一條...
閱讀 3960·2021-11-24 09:38
閱讀 1225·2021-10-19 11:42
閱讀 1829·2021-10-14 09:42
閱讀 2154·2019-08-30 15:44
閱讀 544·2019-08-30 14:04
閱讀 2888·2019-08-30 13:13
閱讀 1949·2019-08-30 12:51
閱讀 956·2019-08-30 11:22