Goで作成したAPIをDockerで動かす

2022/04/27に公開

環境

  • Go 1.17
  • Mac OS 12.3.1

前提

  • Goの環境構築が済んでいる
  • Dockerが利用出来る

目次

  1. GoでAPI作成
  2. APIの動作確認
  3. Dockerfileの作成
  4. docker image&containerの作成
  5. 動作確認

1. GoでAPI作成

楽するためにGinを使います。

// 作業ディレクトリを作成
$ mkdir go-sample

// 作業ディレクトリに移動
$ cd go-sample

// main.goを作成
$ touch main.go

// go modulesの初期化
$ go mod init go-sample

// ginのインストール
$ go get -u github.com/gin-gonic/gin

main.go

main.goを書いていきます

package main

import (
	"log"

	"github.com/gin-gonic/gin"
)

func main() {
	log.Println("start server...")
	r := gin.Default()
	r.GET("/hello", func(context *gin.Context) {
		context.JSON(200, gin.H{
			"message": "Hello World!",
		})
	})
	log.Fatal(r.Run())
}

curl エンドポイント/helloを実行したら、 {"message": "Hello World!"}が返ってくるだけのAPIが作成できました

2. APIの動作確認

go-sampleディレクトリで以下を実行

$ go run main.go

実行すると、色々メッセージが出てくると思います

curlでAPIの動作を確認してみます

Ginはアプリケーション側で特にポートを指定していない場合は8080ポートとなります

curl http://localhost:8080/hello

3. Dockerfileの作成

Dockerで動作させるためにDockerfileを作成していきます

FROM golang:1.17-alpine
ENV ROOT=/go/src/app
RUN mkdir ${ROOT}
WORKDIR ${ROOT}

COPY go.mod go.sum ./
COPY . .
RUN go get

RUN CGO_ENABLED=0 GOOS=linux go build -o $ROOT/binary
EXPOSE 8080
CMD ["/go/src/app/binary"]
  1. ワーキングディレクトリの作成
  2. パッケージインストール
  3. Goアプリのバイナリ作成
  4. バイナリを実行

最小限で作成

4. docker image&containerの作成

Goの簡易APIとDockerfileの準備も出来たので、Docker imageの作成とcontainerの作成をやっていきます。

go-sampleディレクトリで、go-sample-imageという名前のimageを作成します

$ docker build ./ -t go-sample-image

docker imageが作成されたか以下で確認します

$ docker images | grep go-sample-imager
// 以下のように出て来ればimageが正しく作成されています
// go-sample-image latest

上記で作成したimageを元にhelloという名前のcontainerを作成します。
Goで作成したAPIはcontainer内で8080ポートになっており、ローカルマシンからは8000ポートで呼び出したいので、8000でバインディングしてあげます

$ docker run --name hello -d -p 8000:8080 go-sample-image

5. 動作確認

$ curl http://localhost:8000/hello
// {"message":"Hello World!"}

以上で完成です
次はこの記事で作成したdocker imageを使ってkubernetesでGoアプリケーションを動かしてみるを書こうと思います

Discussion