在基於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文件夾裏有了剛上傳的圖片
再去看看數據庫裏有沒有插入圖片的記錄
至此大功告成!