【Docker】GolangでMySQLのデータベースと接続
APIを呼び出し、DB操作できるWebシステムの構築を目指す記事の第2弾です。 今回は、DockerでGoとMySQLのコンテナを起動し、Go側からデータベースへ接続できる環境の構築までを行います。
前回: 【Docker】Hot Reload可能なReact環境の構築 - 白米のおとも
Version
ディレクトリ構成
.
├── docker-compose.yml
├── golang
│ ├── Dockerfile
| └── .env
│ └── app
│ ├── go.mod
│ ├── go.sum
│ └── main.go
└── mysql
├── Dockerfile
└── my.cnf
└── .env
環境構築手順
docker-compose.ymlを作成する
services: go: build: context: ./golang dockerfile: Dockerfile tty: true ports: - "8080:8080" env_file: - ./golang/.env depends_on: - db volumes: - ./golang/app:/go/src/app networks: - golang_network db: container_name: db_docker build: context: ./mysql dockerfile: Dockerfile tty: true platform: linux/x86_64 ports: - 3306:3306 env_file: - ./mysql/.env volumes: - ./mysql/my.cnf:/etc/mysql/my.cnf # 設定ファイルの共有 - mysql_volume:/var/lib/mysql # ボリュームのマウント networks: - golang_network volumes: mysql_volume: name: mysql_volume networks: golang_network:- ./golangディレクトリを作成する
- ./golang以下にGo用の設定ファイルを準備する
- Docekrfile
FROM golang:1.23.2-alpine3.20 ENV GO111MODULE on RUN apk update && \ apk --no-cache add git && \ apk add bash RUN mkdir /go/src/app WORKDIR /go/src/app CMD ["go", "run", "main.go"]- .env
DB_HOST=db_docker DB_USER=user DB_PASS=password DB_NAME=test_database DB_PORT=3306 - ./golang/appディレクトリを作成する
main.goを作成する
package main import ( "database/sql" "fmt" "log" "os" "time" "github.com/go-sql-driver/mysql" ) func main() { jst, err := time.LoadLocation("Asia/Tokyo") if err != nil { log.Fatal("Error load location: ", err) } c := mysql.Config{ DBName: os.Getenv("DB_NAME"), User: os.Getenv("DB_USER"), Passwd: os.Getenv("DB_PASS"), Addr: os.Getenv("DB_HOST") + ":" + os.Getenv("DB_PORT"), Net: "tcp", ParseTime: true, Collation: "utf8mb4_unicode_ci", Loc: jst, } db, err := sql.Open("mysql", c.FormatDSN()) if err != nil { log.Fatal("Error lopending database: ", err) } defer db.Close() if err := db.Ping(); err != nil { log.Fatal("Error connecting to database: ", err) } fmt.Println("Successfully connected to the database!") }go.modの設定を行う
go mod init app go mod tidy- MySQL用の設定ファイルを準備する
- Dockerfile docker-compose.ymlにporの設定を入れているので、Dockerfileへの記載は不要。
FROM mysql:8.0 ENV LANG ja_JP.UTF-8- my.cnf
[mysqld] character-set-server=utf8mb4 collation-server=utf8mb4_general_ci [client] default-character-set=utf8mb4- .env
MYSQL_DATABASE=test_database MYSQL_USER=user MYSQL_PASSWORD=password MYSQL_ROOT_PASSWORD=root_password コンテナを起動する
docker-compose up --build- "Successfully connected to the database!"が表示されることを確認する
おわり。
メモ
- Sequel Aceへの接続
Sequel Aceはすでにcaching_sha2_passwordに対応しているようなので、特にMySQL側の設定を触る必要はない。
