如何用Docker定製你本身的Beego環境

如何用Docker定製你本身的Beego環境

前言:
學習golang幾個月了,一直在論壇和qq羣裏潛水,一直都想寫點什麼回報你們積極的知識分享。php

前幾日在CSDN上看到了一篇文章:如何將nodeclub構建成Docker鏡像.也對docker有所瞭解,就來分享一下我平時怎麼應用docker來跑個人項目。node

1、爲何要用Docker

先引用Beego做者謝大描述虛擬機的一段話:"日常咱們常常會遇到這樣的問題:在開發機上面開發完畢程序,放到正式環境以後會出現各類奇怪的問題:描述符少了、nginx配置不正確、MySQL編碼不對、php缺乏模塊、glibc版本過低等。因此咱們就須要虛擬開發環境,咱們虛擬和正式環境同樣的虛擬開發環境"mysql

可是虛擬機真的好重,虛擬機不只啓動慢,並且浪費不少的cpu,內存資源,因而應運而生了docker,爲咱們提供了一個輕量級的虛擬環境。linux

關於docker的更多介紹資料就不少了。InfoQ的這一系列文章很值得閱讀。nginx

關於如何使用Docker,能夠參考上面nodeclub的文章官方文檔git

2、小試牛刀,用Docker構建一個Beego的環境並運行hello程序

首先來貼上個人Dockerfilegithub


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"]

先附上這個項目github地址。可是其中的依賴包須要本身get而且放到github.com目錄下。golang

咱們一句一句分析:sql

1.FROM golang:1.4.2 這句話必須是Dockerfile的第一句話,而且指明我要用的基礎鏡像。這裏我用的是dockerHub的官方golang:1.4.2鏡像,畢竟官方鏡像纔是最值得信賴的。
2.MAINTAINER puppy 指明做者是誰,無關緊要。
3.ADD github.com /go/src/github.com查閱golang:1.4.2鏡像說明咱們瞭解到該鏡像的GOPATH是/go目錄。因而咱們將提早準備好的"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 由於Dockerfile 的RUN命令只支持linux的基本命令,而咱們在生成bee工具時候須要用到go。 install,因此咱們只能經過運行腳原本生成bee工具。
5.RUN chmod +x /build.sh 爲腳本賦運行權限,也能夠提早賦好權限,就不用在構建過程當中運行這條命令了。
6.RUN /build.sh運行腳本,構建bee工具。
7.ENV PATH $PATH:$GOPATH/bin 將bee工具添加到環境變量裏。
8.ADD hello /go/src/hello將咱們的hello項目添加到$GOPATH下面。
9.EXPOSE 8080 啓動容器後容器暴露給外部的端口
10.CMD ["/run.sh"]CMD命令是咱們在根據鏡像啓動容器後自動執行的動做,這裏咱們添加了run.sh腳本,這個腳本就是用bee run 來啓動咱們hello項目的。
經過上邊nodjs的文章瞭解到時速雲提供了一個能夠在windows下構建鏡像的tce客戶端。
1.下載後,安裝須要配置環境變量。
2.進入到項目目錄,目錄下包含了Dockerfile以及Dockerfile裏須要的build.sh,run.sh,和beego須要的包文件。
3.輸入 tce push beetest就開始構建鏡像了。簡單粗暴。
4f995d44cd09ffc7ca5a20492d97091a.pngdocker

4.構建過程當中,能夠查看到整個過程的日誌輸出。

5.構建完成後咱們就能夠進入 官網-》鏡像-》個人鏡像 下找到咱們剛剛構建的鏡像了。而後就能夠直接經過這個鏡像直接建立容器了。

9ddef1dd8a6e1e74769c80c3c4b69be8.png

6.在的容器頁下能夠直接建立容器,省心省力。直接打開,看到咱們的小 beego。

03ddeae7de45719342eb638d4ec3bcda.png

3、初步實踐,開發過程當中用到docker

若是是在咱們平時的開發過程當中,以上的方法確定是不可取的。否則每次對代碼有一點點改動,難道就要從新構建一個beego的鏡像麼?

NO

docker好處之一就是隨時能夠把想要定製化的容器隨時打包成鏡像

因而咱們能夠將以上的鏡像分紅兩部分,讓咱們的不須要常常改動的package打成一個鏡像A,再將咱們的常常開發的代碼用以前構建的鏡像A爲base鏡像,構建成咱們經常使用的產品鏡像。

那麼問題又來了

咱們在寫程序的過程當中,經常會引入了新的代碼包,是否是還要一併的從新構建beego鏡像。但是咱們猿類都如今趨向於解耦,固然耦合度越低越好了。因而咱們能夠將此分爲三層。

用golang:1.4.2鏡像構建成的Beego鏡像mybeego
用mybeego鏡像構建成的包含項目依賴的Packages的鏡像beego-package
用beego-package鏡像構建成的包含項目代碼的鏡像myhello
這樣mybeego 能夠提交到DockerHub做爲一個公共的Beego基礎鏡像。 beego-package 是咱們不常改動的代碼依賴環境鏡像。 myhello 是咱們常常改動的代碼鏡像。

因而能夠將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基礎鏡像的github地址。的也能夠在時速雲共有鏡像找到。

這樣,把模塊細化,產品運行環境隔離,只要你構建成功,而且成功跑起來了該項目。那麼之後不再會出現讓不少人頭疼的環境問題了。而且你也能夠將這個鏡像打包,直接把這個鏡像在產品環境啓動,都是OK沒問題的,只要你的PC裝了docker就能夠。

4、懶人絕招、鏡像都懶得構建

我就是個懶人,原本windows是安裝不了docker的,可是懶得開虛擬機,因此用了時速雲這個客戶端。以上作法都已經很簡便開發了,可是每次構建還都須要從新構建一個鏡像,雖然步驟簡單,可是也很讓人煩。

有沒有不用每次構建鏡像就能夠開發的方法麼?

固然有!

可是你必須是在linux環境下。咱們應用的是Docker -v命令, volume映射的方法。

首先要小小改動一下咱們代碼的Dockerfile

myhello:v1

ADD run.sh /

RUN chmod +x /run.sh

EXPOSE 8080

CMD ["/run.sh"]

對比發現,只是把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是對應咱們host宿主機的端口。

-v 命令是文件映射的命令,經過以上的命令,將宿主機的/root/beego-blog文件夾,映射到了$GOPATH/src/beego-blog文件夾。其中要注意的是-v後參數 前面的是host宿主機路徑,後面是容器路徑,而且路徑都必須是絕對路徑。

啓動容器後,你就能夠訪問localhost:8006來訪問咱們的myhello程序了。若是你對代碼有了改動。將會自動同步到容器內部,只須要docker restart container_id 就能夠了。(其實若是你run.sh裏的啓動方式是bee run,固然代碼會自動從新運行的)。

是否是很是酷!這樣來講既沒有了各類環境問題帶來的困擾,又能夠輕鬆編寫構建代碼了。最重要的是你不須要再爲了遷移部署到其餘地方再搭一遍環境了。

5、我的體會、取之於docker,用之於docker

我的來講,學習go語言幾個月了,期間也看了一些docker。docker就是go語言的一個精良產物,而且圍繞docker的不少工具也都是用go來寫的,看着內心就有一種大go要崛起的趕腳。

平時在工做的時候,有時候在測試機上要跑個簡單的go程序,可是發現沒有go環境,裝環境還煩,剛好機器上有docker。隨便寫個Dockerfile。用命令 docker run -ti myimage /bin/bash就跑到容器裏去調程序,當時的真的感受"這東西咋這麼方便呢",若是你要弄個php,ruby這些都不用去弄環境了,直接容器裏就都有了,用着真的很方便。

在說說我在時速雲上一點點發現。在他們的鏡像區裏的公有鏡像有好多新奇的發現。其中發現一個的Discuz鏡像,出於好奇,我建了一個discuz容器和mysql容器。

40d8cdb968584d4368d91feacae32b74.png

而後就直接裝上了這個discuz,而且能夠直接當作管理員來各類拖拽玩了。仍是挺有意思的。經過這些來看,docker確實爲咱們帶來了不少便利,即便不懂技術,能夠根本不會部署各類環境,可是隻要會用linux系統就能夠從頭至尾維護一個社區網站了,甚至是作更多用處了。

be8f556dd86269a5c8d03fef997c29d7.png

相關文章
相關標籤/搜索