⛳
Goで作成したAPIをDockerで動かす
環境
- Go 1.17
- Mac OS 12.3.1
前提
- Goの環境構築が済んでいる
- Dockerが利用出来る
目次
- GoでAPI作成
- APIの動作確認
- Dockerfileの作成
- docker image&containerの作成
- 動作確認
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"]
- ワーキングディレクトリの作成
- パッケージインストール
- Goアプリのバイナリ作成
- バイナリを実行
最小限で作成
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