Dockerで立てたmysqlにgolangから接続する方法

More than 3 years have passed since last update.

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