3
3

More than 1 year has passed since last update.

【前編】Go + MySQL + React + Docker開発環境構築

Posted at

【本記事の概要】

本記事では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」が表示されている。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3