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_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安裝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 <name or id>: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

④ 驗證,訪問localhost:8080

用postman上傳一張圖片:

可以看到static文件夾裏有了剛上傳的圖片

再去看看數據庫裏有沒有插入圖片的記錄

至此大功告成!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章