使用Docker在Golang中尝试连接到MySql
我想做的事情
我想要从Golang容器连接到MySQL容器!
环境
Docker 版本 19.03.8
Docker Compose 版本 1.25.5
仓库
文件夹的层次结构
根目录 /
├ 应用 /
| └ main.go
├ Docker /
| └ Dockerfile
└ docker-compose.yaml
创建main.go
这次我们将使用一个名为gorm的ORM库来进行连接。
https://gorm.io/
package main
import (
"fmt"
"net/http"
_ "github.com/go-sql-driver/mysql"
"github.com/jinzhu/gorm"
)
func main() {
http.HandleFunc("/", index)
http.ListenAndServe(":80", nil)
}
// mysqlのconnectionが確認できれば「DB接続成功」が表示される
// 接続に失敗時はエラーメッセージを吐く
func index(w http.ResponseWriter, r *http.Request) {
_, err := sqlConnect()
if err != nil {
fmt.Fprintf(w, err.Error())
} else {
fmt.Fprintf(w, "DB接続成功")
}
}
// connetion確認func
func sqlConnect() (database *gorm.DB, err error) {
DBMS := "mysql"
USER := "root"
PASS := "golang"
PROTOCOL := "tcp(mysql:3306)"
DBNAME := "mysql"
CONNECT := USER + ":" + PASS + "@" + PROTOCOL + "/" + DBNAME + "?charset=utf8&parseTime=true&loc=Asia%2FTokyo"
return gorm.Open(DBMS, CONNECT)
}
编写Dockerfile
我正在安装所需的gorm和mysql驱动程序。似乎需要有git才能运行。而且最好减少运行命令的数量,但我相信肯定有更好的方法。
FROM golang:alpine
# フォルダ作成
RUN mkdir /app
# 作成したフォルダ内にmain.goを配置
COPY ./app /app
# 作業場所を/appに設定(main.goがある場所)
WORKDIR /app
# 必要ライブラリをインストール
RUN apk add --no-cache git
RUN go get "github.com/go-sql-driver/mysql"
RUN go get -u github.com/jinzhu/gorm
# main.goをbuild
RUN go build -o main .
# port開放
EXPOSE 80
# app開始
CMD ["/app/main"]
创建docker-compose.yaml文件
使用Docker Compose运行Golang和MySQL。无需特别说明。
version: '3'
services:
golang:
build:
context: .
dockerfile: ./docker/Dockerfile
ports:
- "80:80"
container_name: go-sample
depends_on:
- mysql
mysql:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: golang
MYSQL_USER: golang
MYSQL_PASSWORD: golang
MYSQL_DATABASE: golang
container_name: mysql
执行并进行数据库连接确认。
# docker-compose.yamlのある階層で実行
$docker-compose up -d
....
# 立ち上がったよ!メッセージが出たらOK
Creating mysql ... done
Creating go-sample ... done
当连接到localhost时,应该会显示“数据库连接成功”。
连接成功!!!!
竟然很容易地连接上了…果然还是Go厉害啊…