在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"] = "astaxie@gmail.com"
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文件夹中可以看到刚才上传的图片啦
至此,大功告成!