在beego工程裏,使用go build可以將該工程打包成一個二進制文件,那麼這個二進制文件在docker裏面該怎麼部署呢?
先寫一個簡單的圖片上傳的demo,名字叫docker_test
在工程目錄裏用命令 bee new docker_test 創建一個beego工程
response.go
package models
type ResponseJson struct {
Code int `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"data,omitempty"` //tag裏面加上omitempy,可以在序列化的時候忽略0值或者空值
}
route.go
package routers
import (
"docker_test/controllers"
"github.com/astaxie/beego"
)
func init() {
beego.Router("/", &controllers.MainController{})
beego.Router("/image/upload",&controllers.ImageUploadController{})
}
controller.go
package controllers
import (
"docker_test/dao"
"docker_test/models"
"github.com/astaxie/beego"
)
type MainController struct {
beego.Controller
}
type ImageUploadController struct {
beego.Controller
}
func (c *MainController) Get() {
c.Data["Website"] = "beego.me"
c.Data["Email"] = "[email protected]"
c.TplName = "index.tpl"
}
func (c *ImageUploadController) Post() {
var code int
file, fileHeader, _ := c.GetFile("img")
beego.Info("收到圖片上傳")
if file != nil {
defer file.Close()
savePath := "static/img/" + fileHeader.Filename
beego.Info("保存圖片")
}
code = 200
beego.Info("返回json")
c.Data["json"] = &models.ResponseJson{Code:code,Msg:"success"}
c.ServeJSON()
}
其他都默認就好,工程目錄如圖:
打開Terminal界面,在項目的根目錄,使用go build 命令將項目編譯成一個二進制的可執行文件
ok,準備工作做完,這個簡單的工程主要就是上傳一張圖片,並將圖片保存到靜態文件目錄中
下面開始將docker_test這個文件部署到服務器的docker中
1、將項目的conf文件夾、static文件夾、views文件夾以及docker_test文件拷貝到服務器目錄中
2、編寫DockerFile文件
sudo vim DockerFile
然後開始編輯DockerFile
FROM golang:latest
#創建工作目錄
RUN mkdir -p /go/src/go_test/static/
#進入工作目錄
WORKDIR /go/src/go_test
#將DockerFile文件所在目錄下的所有文件複製到指定位置
COPY . /go/src/go_test
#下載beego、bee以及mysql驅動
#RUN go get github.com/astaxie/beego && go get github.com/beego/bee && go get github.com/go-sql-driver/mysql
#端口
EXPOSE 8080
#CMD ["bee","run"]
#修改docker_test文件的權限
RUN chmod 777 ./docker_test
#執行docker_test文件
ENTRYPOINT ["./docker_test"]
3、開始構建鏡像(在DockerFile文件所在目錄下,注意命令後面有一個小點)
sudo docker build -f DockerFile -t go_app:1.0 .
這樣就表示鏡像構建完成了,此時可以用docker images命令查看剛纔build的鏡像
4、以go_app爲模板新建鏡像並運行鏡像(注:下面是一條完整的命令)
sudo docker run -it --name mga -p 8080:8080 -v /home/lenovo/docker_test/go_test/static/:/go/src/go_test/static/
--privileged=true go_app:1.0
註解:--name mga 構建的新鏡像命名爲mga
-p 8080:8080 將鏡像內的8080端口映射到宿主機的8080端口
-v /home/lenovo/docker_test/go_test/static/:/go/src/go_test/static/ 將宿主機的 /home/lenovo/docker_test/go_test/static/目錄對應到容器內的/go/src/go_test/static/目錄,實現數據共享,可以接多個 -v
--privileged=true Docker掛載主機目錄Docker訪問出現cannot open directory .: Permission denied,解決辦法:在掛載目錄後多加一個--privileged=true參數即可
go_app:1.0 爲剛構建的鏡像模板
此時就會新建一個名稱爲mga的鏡像,運行該鏡像並且進入到該鏡像裏面,beego裏面打印的log都可以看到了,如果是想以後臺的方式運行鏡像,則在--name mga後面加上-d就行。
不懂的命令可以參考上一篇文章:docker筆記(一、docker基本命令)
5、驗證
在瀏覽器輸入http://10.5.11.122:8080/ (這裏是我的服務器的ip,端口是8080),可以看到beego的首頁了
另外用postman執行圖片上傳接口,驗證一下圖片是否共享出來了
此時在服務器的項目目錄的static/img文件夾中可以看到剛纔上傳的圖片啦
至此,大功告成!