【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

環境構築手順

  1. 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:
    
  2. ./golangディレクトリを作成する
  3. ./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
    
  4. ./golang/appディレクトリを作成する
  5. 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!")
     }
    
  6. go.modの設定を行う

     go mod init app
     go mod tidy
    
  7. 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
    
  8. コンテナを起動する

     docker-compose up --build
    
  9. "Successfully connected to the database!"が表示されることを確認する

おわり。

メモ

  • Sequel Aceへの接続 Sequel Aceはすでにcaching_sha2_passwordに対応しているようなので、特にMySQL側の設定を触る必要はない。

次回