1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Go+Gin+GORMでDocker開発環境構築

Last updated at Posted at 2024-05-26

はじめに

Go言語でAPIの開発環境を構築するにあたって、Go+Gin+GORM(+air)の備忘録として残しておきます。

GO言語とは

Google が開発したプログラミング言語であり、「Go言語」や「Golang」と表記されます。

Ginフレームワークとは

Go言語で書かれた Web フレームワークの1つです。
パフォーマンスに優れているため、API開発にも利用されます。

GORMライブラリとは

Go言語で開発されたORM (Object-Relational Mapping)ライブラリです。

air

Go言語のホットリロードツールです。ホットリロードというのは「開発中のコード変更が即座に反映され、アプリを再起動することなく、リアルタイムなプレビューが可能な機能」のことです。

セットアップ

実行条件

  • Windows 10

  • Ubuntu-22.04 (WSL2)

  • docker compose v2.27.0

  • Golang v1.22.3

  • Gin v1.10.0

  • GORM v1.25.10

  • air v1.52.0

  • MySQL 8.0.29

今回はDockerで進めていきます。
WSLにDocker環境を構築する手順は以下を参考にしてください。

Dockerデーモンが起動している前提( sudo service docker start )で進めていきます。

ディレクトリ構成

最終的には次のような構成になります。

go-gin-gorm
├── tmp
├── .air.toml
├── docker-compose.yml
├── Dockerfile
├── go.mod
├── go.sum
└── main.go

プロジェクトの準備

プロジェクトを作りましょう。今回はgo-gin-gormとしています。

$ mkdir go-gin-gorm
$ cd go-gin-gorm

コンテナ作成

docker-compose.yml を作成します。

docker-compose.yml
services:
  go:
    build: .
    ports:
      - "8080:8080"
    volumes:
      - .:/app
  mysql:
    image: mysql:8.0.29
    platform: linux/amd64
    environment:
      MYSQL_ALLOW_EMPTY_PASSWORD: "yes"
      MYSQL_DATABASE: first
    volumes:
      - db-vol:/var/lib/mysql
    ports:
      - "3306:3306"
volumes:
  db-vol:

今回は構築と簡単な動作確認だけが目的なので、DBの設定は適当です。

次に Dockerfile を用意します。

Dockerfile
FROM golang:1.22.3
WORKDIR /app
RUN go install github.com/cosmtrek/air@v0.10.2
CMD ["air"]

準備ができたらDockerを立ち上げて開発環境にアクセスします。

$ docker compose up -d

$ docker compose exec go bash

開発準備

ここからはGO開発環境で行います。

まずはgo modを初期化します。

$ go mod init go_gin_gorm

.air.tomlをデフォルト設定で作成します。

$ air init

Ginのパッケージを取得します。

$ go get -u github.com/gin-gonic/gin@v1.10.0

これでGinの導入は完了です。 main.go を作成して動作確認をしてみましょう。

main.go

package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
)

func main() {
    engine:= gin.Default()
    engine.GET("/", func(c *gin.Context) {
        c.JSON(http.StatusOK, gin.H{
            "message" : "hello world!",
        })
    })
    engine.Run(":8080")
}

ブラウザなどで http://localhost:8080 にアクセスしてみましょう。
次のように表示されればOKです。

{
    "message" : "hello world"
}

次はGORMです。Ginの導入と同じように go get で導入しましょう。

$ go get -u gorm.io/gorm@v1.25.10
$ go get -u gorm.io/driver/mysql

これで導入は完了です。こちらも念のため動作確認をしてみましょう。

main.goを修正する前に、DBの設定を行いましょう。 MySQL Workbench アプリやUbuntuで docker compose exec mysql bash によりmysql環境にアクセスするなどして、以下のようなテーブルとデータを作成してください。

◆テーブル名
results

◆テーブル構成

カラム名
id INT
name VARCHAR(45)

◆テストデータ

id name
1 Test

main.goは以下のように書き換えます(前述のものを総書き換えしましょう)

main.go
package main

import (
    "github.com/gin-gonic/gin"
    "net/http"
    "gorm.io/driver/mysql"
    "gorm.io/gorm"
)

type Result struct {
    Id int
    Name string
}

func main() {
    engine:= gin.Default()
    engine.GET("/", func(c *gin.Context) {
        //DB接続
        dsn := "root@tcp(mysql:3306)/first?charset=utf8mb4&parseTime=True&loc=Local"
        db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
        if err != nil {
            panic("failed to connect database")
        }

        // レコードを1行取得
        var result Result
        db.First(&result)

        c.JSON(http.StatusOK, gin.H{
            "test" : result.Name,
        })
    })
    engine.Run(":8080")
}

ブラウザなどでlocalhost:8080にアクセスしてみましょう。次のように表示されればOKです。

{
    "test" : "Test"
}

これでGo,Gin,GORMを用いた開発環境の準備は完了です。
今回はここまで。Go言語の記法は独特なので慣れるまで時間がかかりそうです。

1
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
1
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?