使用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)
}

// mysqlconnectionが確認できれば「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时,应该会显示“数据库连接成功”。

スクリーンショット 2020-05-17 17.48.01.png

连接成功!!!!
竟然很容易地连接上了…果然还是Go厉害啊…

广告
将在 10 秒后关闭
bannerAds