【本記事の概要】
本記事ではGo + MySQL + React + Dockerでの開発環境を構築を行う記事の前編です。前編ではGo + MySQL + Dockerで構築を行い、後編でReactの設定をしていきたいと思います。前編の完成形は以下の4点を満たした形にしています。
● localhost:8080にて「Hello, World!」と表示される。
● MySQLとの接続ができており、ログに「Connected」と表示される。
● Goの外部パッケージであるEcho・GORMが使用できている
● コードの変更のたび、ビルドが行ってくれるAirが起動している。
【フォルダ構成】
前編である本記事では以下のようなフォルダ構成にしております。「front」フォルダについては現時点では必要ありませんが、後編にて使うので今のうちに作っておきます。
※ 「tmp」フォルダはこの後導入するAirを実行すると自動で作成されるのでdockerの立ち上げ前に作っておく必要はないです。
※ 「README.md」についても必須というわけではないです。
- api
- db
- db.go
- tmp
- build-errors.log
- .env
- go.mod
- go.sum
- main.go
- front
- .gitattributes
- api.dockerfile
- db.dockerfile
- docker-compose.yml
- README.md
【GoのDockerfile】
※ Dockerの基本的な記述にはコメントの解説を記載していません。
(api.dockerfile)
FROM golang:1.20
WORKDIR /app/api
## ローカル上の「apiフォルダ」配下の「go.modファイル」と「go.sumファイル」を、Docker上の作業ディレクトリ「/app/api」にコピーしています。
COPY api/go.mod .
COPY api/go.sum .
## Goのパッケージのダウンロードと、Goの依存関係の整理を行っています。
RUN go mod download && go mod verify
# ローカル上の「apiフォルダ」を、Docker上の「/app/api」にコピーしています。
COPY ./api /app/api
# Airをインストールし、コンテナ起動時に実行しています。
# Airが導入されることでコードの変更の度にビルドを自動でしてくれます。
# これがないといちいちdockerをビルドし直さないと変更が反映されません。
RUN go install github.com/cosmtrek/air@latest
CMD ["air"]
【MySQLのDockerfile】
(db.dockerfile)
FROM mysql:8.0
ENV LANG ja_JP.UTF-8
【docker-compose.yml】
※ Dockerの基本的な記述にはコメントの解説を記載していません。
(docker-compose.yml)
version: '3.8'
services:
api:
## goのコンテナの名前を指定しています。
container_name: test_app_api
## ビルドするdockerfileの場所とファイル名を指定しています。
## 「docker-compose.yml」と同階層の「api.dockerfile」を指定
build:
context: .
dockerfile: api.dockerfile
stdin_open: true
tty: true
ports:
- 8080:8080
depends_on:
- db
## ローカルの「apiフォルダ」「go.mod」「go.sum」をDocker上の指定の位置にボリュームしています。
volumes:
- ./api:/api
- ./api/go.mod:/api/go.mod
- ./api/go.sum:/api/go.sum
db:
## MySQLのコンテナの名前を指定しています。
container_name: test_app_db
## ビルドするdockerfileの場所とファイル名を指定しています。
## 「docker-compose.yml」と同階層の「db.dockerfile」を指定
build:
context: .
dockerfile: db.dockerfile
tty: true
ports:
- 3306:3306
## MySQLへの接続情報
## みなさんの任意の内容を設定してください。
## ただしDB接続設定のため後で「.env」ファイルの記述に使います。
environment:
MYSQL_ROOT_PASSWORD: ****
MYSQL_DATABASE: ****
MYSQL_USER: ****
MYSQL_PASSWORD: ****
volumes:
- type: volume
source: mysql_data
target: /var/lib/mysql
volumes:
mysql_data:
【DB接続設定】
dbフォルダを作成、以下の「db.go」を作成し、db接続のための設定を記述してください。
※ goのコードの解説は今回のメインではないので主要部分のみ解説します。
(db.go)
package db
import (
"fmt"
"log"
"os"
"github.com/joho/godotenv"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
// DBとの接続設定
func NewDB() *gorm.DB {
// ここで環境変数を読み込んでいます。
// 環境変数を記述する「.env」にDB接続用のURLを記載しているため
err := godotenv.Load()
if err != nil {
log.Fatalln(err)
}
//「.env」のDB接続用のURLのDB_DNSを呼び出します。
url := os.Getenv("DB_DNS")
// ここでGoの外部パッケージである「GORM」を使用し、MySQLと接続します。
db, err := gorm.Open(mysql.Open(url), &gorm.Config{})
if err != nil {
log.Fatalln(err)
}
// 成功したら「Connected」を出力します。
fmt.Println("Connected")
return db
}
// DBのclose設定
func CloseDB(db *gorm.DB) {
sqlDB, _ := db.DB()
if err := sqlDB.Close(); err != nil {
log.Fatalln(err)
}
}
【main.go】
dbの接続と、ルーティングの設定に関する内容を記述
(main.go)
package main
import (
"net/http"
"api/db"
"github.com/labstack/echo/v4"
)
func main() {
// ここでdb/db.goのMySQL接続用の関数を呼び出します。
db.NewDB()
e := echo.New()
e.GET("/", articleIndex)
e.Logger.Fatal(e.Start(":8080"))
}
func articleIndex(c echo.Context) error {
// localhost:8080にアクセスした時、ブラウザ画面に「Hello, World!」と表示されるよう設定しています。
return c.String(http.StatusOK, "Hello, World!")
}
【その他ファイル】
(.env)
// 「ユーザー名」「パスワード」「ポート番号」「データベース名」はdocker-compose.ymlに記載した内容を記述してください。
DB_DNS="ユーザー名:パスワード@tcp(db:ポート番号)/データベース名?charset=utf8mb4&parseTime=True&loc=Local"
(go.mod)
// go.modの一階層上の「api」フォルダ名を記載
module api
// dockerfileで指定したGoのバージョンを記載
go 1.20
(go.sum)
こちらのファイルの内容は空にしてください。
【Dockerの起動】
● dockerのビルド
$ docker-compose build
● goのパッケージをインストール
$ docker-compose run api go mod tidy
● dockerの起動
docker-compose up
【確認】
以下3点ができていればOKです。お疲れ様でした。
● localhost:8080にブラウザからアクセスして「Hello, World!」と表示されている。
● MySQLとの接続ができており、docker起動後のログに「Connected」と表示されている。
● docker起動時に大きく「Echo」「Air」が表示されている。