##やりたいこと
GolangコンテナからMySqlコンテナに接続したい!
##環境
docker 19.03.8
docker-compose 1.25.5
##リポジトリ
https://github.com/atsugitakuya/go-mysql-docker.git
##フォルダ階層
root /
├ app /
| └ 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のdriverをインストールしている。
なんかgitがないと動かないっぽい。あとRunコマンドは少なくした方がいいが良い。
多分もっと良い方法があるはず....
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作成
golangとmysqlを動かすためのdocker-compose。特に説明することない。
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
##実行し、DBの接続確認を行う
# docker-compose.yamlのある階層で実行
$docker-compose up -d
....
# 立ち上がったよ!メッセージが出たらOK
Creating mysql ... done
Creating go-sample ... done
localhostに接続すると、「DB接続成功」が出るはず...
接続成功!!!!
意外と簡単に接続できた...さすがGoだな...