docker笔记(六、docker将beego程序和mysql关联起来)

在基于docker笔记(四、docker部署beego打包后的二进制文件)和docker笔记(五、docker安装mysql数据库)的基础上,上传图片的同时,也网数据库中插入一条记录。

beego部分代码(在docker笔记(五、docker安装mysql数据库)的基础上添加了一些代码)

conf/app.conf

appname = docker_test
httpport = 8080
runmode = dev

mysqlUser = root
mysqlPwd = ailab
mysqlHost = localhost
mysqlPort = 3306
mysqlDbName = docker_test

models/init.go

package models

import (
	"fmt"
	"github.com/astaxie/beego"
	"github.com/jinzhu/gorm"
	_ "github.com/jinzhu/gorm/dialects/mysql" // import your used driver
	"time"
)

var db *gorm.DB

var mysqlUser string
var mysqlPwd string
var mysqlHost string
var mysqlPort string
var mysqlDbName string

type BaseModel struct {
	Id        int64     `gorm:"primary_key" json:"-"`
	CreatedAt time.Time `json:"created_at"`
	UpdatedAt time.Time `json:"updated_at"`
}

type Image struct {
	BaseModel
	ImageName   string `gorm:"unique;not null"`
	ImagePath   string `gorm:"not null"`
}

func init() {
	mysqlUser = beego.AppConfig.String("mysqlUser")
	mysqlPwd = beego.AppConfig.String("mysqlPwd")
	mysqlHost = beego.AppConfig.String("mysqlHost")
	mysqlPort = beego.AppConfig.String("mysqlPort")
	mysqlDbName = beego.AppConfig.String("mysqlDbName")

	initMsql()
}

func initMsql() {
	var err error
	mysqlArgs := fmt.Sprintf("%s:%s@tcp(%s:%s)/%s?charset=utf8&parseTime=True&loc=Local", mysqlUser, mysqlPwd, mysqlHost, mysqlPort, mysqlDbName)
	beego.Info("sqlStr:",mysqlArgs)
	db, err = gorm.Open("mysql", mysqlArgs)
	if err != nil {
		beego.Info("连接smart数据库错误:", err.Error())
		return
	}
	//defer db.Close()
	//禁用表名复数形式
	db.SingularTable(true)
	//clearTables()
	db.LogMode(false)
	db.Set("gorm:table_options", "charset=utf8").AutoMigrate(
		&Image{},
	)
}

func GetMysqlDB() (db_con *gorm.DB) {
	return db
}

dao/imageDao.go

package dao

import "docker_test/models"

func SaveImage(imageName,imagePath string) error {
	image := &models.Image{ImageName:imageName,ImagePath:imagePath}
	return models.GetMysqlDB().Create(image).Error
}

controllers/default.go

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
		c.SaveToFile("img", savePath)
		err := dao.SaveImage(fileHeader.Filename,savePath)
		beego.Info("保存图片:",err)
	}
	code = 200
	beego.Info("返回json")
	c.Data["json"] = &models.ResponseJson{Code:code,Msg:"success"}
	c.ServeJSON()
}

在本地调试没问题后,执行go build将工程打包成一个可执行的二进制文件

docker笔记(六、docker将beego程序和mysql关联起来)_第1张图片

 

下面开始将docker_test和mysql结合起来

① 将docker_test、conf文件夹、static文件夹和views文件夹拷贝到服务器,然后构建DockerFIle

FROM golang:latest

#创建工作目录
RUN mkdir -p /go/src/go_test/static/

#进入工作目录
WORKDIR /go/src/go_test

#将当前目录下的所有文件复制到指定位置
COPY . /go/src/go_test

#端口
EXPOSE 8080

RUN chmod 777 ./docker_test
ENTRYPOINT ["./docker_test"]

构建镜像

sudo docker build -f DockerFile -t go_app:1.0 .

docker笔记(六、docker将beego程序和mysql关联起来)_第2张图片

② 参考docker笔记(五、docker安装mysql数据库)将mysql容器跑起来

sudo docker run -p 3307:3306 --name mydb -v /home/lenovo/docker_test/mysql/conf/:/etc/mysql/conf.d -v /home/lenovo/docker_test/mysql/logs:/logs -v /home/lenovo/docker_test/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d mysql:latest

③ 运行第一步build的镜像,并和mysql关联起来

sudo docker run -it --name mga --link mydb:mysql -p 8080:8080 -v /home/lenovo/docker_test/go_test/static/:/go/src/go_test/static/ --privileged=true go_app:1.0

 

 --link 是用来连接两个容器

格式为 --link :alias,其中,name和id是源容器的name和id,alias是这个连接的别名。

通俗的讲,站在mga容器(以go_app:1.0镜像为模板创建的容器)的角度来说,mydb和mysql都是容器70bdce0ccbcb(已经跑起来的mysql容器)的名称,并且作为容器的hostname,mga用这2个名字中的哪一个都可以访问到70bdce0ccbcb容器并与之通信(docker通过DNS自动解析)

进入mga容器中,ping哪一个容器都可以ping通,都是指向172.17.0.2

docker笔记(六、docker将beego程序和mysql关联起来)_第3张图片

④ 验证,访问localhost:8080

docker笔记(六、docker将beego程序和mysql关联起来)_第4张图片

用postman上传一张图片:

docker笔记(六、docker将beego程序和mysql关联起来)_第5张图片

可以看到static文件夹里有了刚上传的图片

docker笔记(六、docker将beego程序和mysql关联起来)_第6张图片

再去看看数据库里有没有插入图片的记录

docker笔记(六、docker将beego程序和mysql关联起来)_第7张图片

至此大功告成!

你可能感兴趣的:(docker,beego,mysql)