golangからはデフォルトで入っているdbコネクタ"database/sql"
とドライバ"github.com/go-sql-driver/mysql"
からmysqlに接続できます。
ただ、dockerで立てたmysqlに対して、localhostへの接続がうまく行かなかったので備忘録
前提
dockerは先日限定ユーザにリリースされたdocker betaを使用しています。(多分boot2dockerを使っている場合はそれほど難しくないかも)
ホストOSはOSX El Capitan
です
解決策
dockerでmysqlを立ち上げる
今回はdocker-composeを使用しました。
docker-compose.yml
mysql:
image: mysql
ports:
- "3306:3306" # <-これがないと外からアクセス出来ない
expose:
- 3306
environment:
MYSQL_ROOT_PASSWORD: pass
MYSQL_DATABASE: db
MYSQL_USER: user
MYSQL_PASSWORD: pass
上記を設定した後docker-compose up -d
でmysqlサーバの設定完了
/etc/hostsでlocalhost以外のホストを設定する
mysqlクライアントはlocalhostへの接続をしようとしたときに、ホストにあるmysql.sockを読みに行こうとしますが、dockerで立ち上げているので、そんなものは無いと怒られます。
なので、あたかもリモートサーバにアクセスしているかのように振る舞う必要があるので、暫定的にhostsにlocalhost以外の名前をわりあてました。
/etc/hosts
127.0.0.1 mysql
golangに設定を記述する
上記設定が終われば後はgolangから接続するだけです。
main.go
package main
import (
"database/sql"
_ "github.com/go-sql-driver/mysql"
)
func main() {
dbconf := "user:pass@tcp(mysql:3306)/db"
db, err := sql.Open("mysql", dbconf)
}