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を使用しました。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
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以外の名前をわりあてました。

1
127.0.0.1       mysql

golangに設定を記述する

上記設定が終われば後はgolangから接続するだけです。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
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)
}