GolangでAPIを開発する方法まとめ【Docker・Gin・Nginx・MySQL・Postman・Actions】


 

こんにちは。Tomoyuki(@tomoyuki65)です。

最近ようやくGolangでAPIを開発する方法について調べ始めましたが、Railsなどに比べると「圧倒的に情報が少ない!!」という感じで、なかなか自分が欲しい情報に辿り着かなかったりするので、試行錯誤しながら取り組んでいます。

特に初心者向けにいい感じで情報がまとまっているのがなかったりするので、この記事では基礎的なところを中心にまとめていければと思っています。

これからGolangでAPI開発について学び始めるような方がいたら、ぜひ参考にしてみて下さい。

 



GolangでAPIを開発する方法まとめ【Docker・Gin・Nginx・MySQL・Postman・Actions】

  •  Docker・Nginx・Golang・Ginで簡単なAPIを構築
  •  ホットリロード用に「Air」を追加
  •  routerとcontrollerを追加
  •  config設定を追加
  •  database(MySQL)とマイグレーション(usersテーブル)の追加
  •  modelの追加およびusersテーブルの全レコードをJSON形式で返すAPIの作成
  •  seedとcmdの追加およびAPIの確認
  •  userモデルにCRUDを作る
  •  PostmanでAPIを検証
  •  PostmanでAPIのテストコードを作成
  •  GitHub ActionsでCIの構築(テストの自動化)

 

Docker・Nginx・Golang・Ginで簡単なAPIを構築

まずはDocker環境において、WebサーバーにはNginx、APIにはGolangおよびフレームワークの「Gin」を利用し、ブラウザにJSON形式のデータを出力するような簡単なAPIを構築していきます。

以下のコマンドを実行し、必要なファイルを作成します。(今回の例では最初に作るディレクトリ名を「go_sample」としています。)

$ mkdir go_sample
$ cd go_sample
$ touch docker-compose.yml
$ touch .env
$ mkdir nginx
$ cd nginx
$ touch Dockerfile
$ touch nginx.conf
$ mkdir log
$ cd log
$ touch .keep
$ cd ../..
$ mkdir src
$ cd src
$ touch main.go
$ mkdir docker
$ cd docker
$ mkdir dev
$ cd dev
$ touch Dockerfile
$ cd ../../..

※nginx/logの.keepは、GitHubで管理する際にlogディレクトリを保持させるための工夫です。管理不要なファイルがある場合は「.gitignore」を作成して記述して下さい。

 

次に各種ファイルの中身はそれぞれ以下のようにします。

# Nginxのバージョンは軽量版の「alpine」
FROM nginx:alpine

# インクルード用のディレクトリ内を削除
RUN rm -f /etc/nginx/conf.d/*

# Nginxの設定ファイルをコンテナにコピー
ADD ./nginx/nginx.conf /etc/nginx/conf.d/default.conf

# ビルド完了後にNginxを起動
CMD /usr/sbin/nginx -g 'daemon off;' -c /etc/nginx/nginx.conf

 

server {
  # ポート番号
  listen 80;

  location / {
    # apiの部分はdocker-compose.ymlのサービス名
    proxy_pass http://api:3001;
  }
}

 

# 2023年3月時点の最新版goの軽量版「alpine」
FROM golang:1.20.2-alpine

# インストール可能なパッケージ一覧の更新
RUN apk update && \
    apk upgrade && \
    # パッケージのインストール(--no-cacheでキャッシュ削除)
    apk add --no-cache \
            git \
            gcc \
            musl-dev

# 作業ディレクトリの設定
WORKDIR /go/src

 

package main

import (
  // Ginをインポート
  "github.com/gin-gonic/gin"
)

funcmain() {
  router := gin.Default()

  // JSON形式で「"message": "Hello World"」を出力するAPI
  router.GET("/", func(c *gin.Context) {
    c.JSON(200, gin.H{
      "message": "Hello World",
    })
  })

  router.Run(":3001")
}

 

version: '3'
  services:
    # APIに関する設定
    api:
      container_name: go_sample_api
      build:
        context: .
        dockerfile: ./src/docker/dev/Dockerfile
      env_file:
        - ./.env
      command: go run main.go
      volumes:
        - ./src:/go/src
      tty: true
      stdin_open: true
      ports:
        - "3001:3001"
    # Webサーバーに関する設定
    web:
      container_name: go_sample_web
      build:
        context: .
        dockerfile: ./nginx/Dockerfile
      volumes:
        - ./nginx/log:/var/log/nginx
      ports:
        - "80:80"
      depends_on:
        - api

 

次に以下のコマンドを実行し、Golangのコンテナ(api)だけを起動させてコンテナ内に入ります。

$ docker compose run api ash

 

次にapiコンテナ内で以下のコマンドを実行し、go.modの初期化を行います。

$ go mod init go_sample
$ go mod tidy
$ exit

※go modのモジュール名は「go_sample」にしたため、別のディレクトリに作成したgoのパッケージをインポートする際などは、import “go_sample/パッケージ名”で可能です。また、go.modはパッケージ管理用のファイルなので、利用するパッケージが増減したら「go mod tidy」を実行して管理していきます。尚、コンテナから抜けるため、最後に「exit」を実行しています。

 

これで最低限の準備が整ったので、以下のコマンドを実行し、コンテナを再ビルドした後にコンテナを起動させます。

$ docker compose build --no-cache
$ docker compose up -d

 

コマンド「docker compose ps」を実行し、STATUSが「running」になればコンテナ起動中です。

 

ブラウザから「localhost」にアクセスし、以下のようにメッセージが出力されればOKです。

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です