Docker コンテナ上に Go の Echo サーバーを構築してみた

Go の API サーバーが欲しかったので、Docker で Echo サーバーを構築してみた。

ディレクトリー構成

1
2
3
4
5
+- docker-compose.yml
+- app
+- Dockerfile
+- src
+- server.go

docker-compose.yml

1
2
3
4
5
6
7
8
version: '2'
services:
app:
build:
context: ./app
ports:
- 8080:8080
tty: true

app/Dockerfile

1
2
3
4
5
6
7
8
9
10
11
FROM golang:1.13.6-alpine

WORKDIR /go/src

COPY ./src/server.go /go/src/server.go

RUN go mod init server \
&& go mod tidy \
&& go build

CMD ["go", "run", "server.go"]

app/src/server.go

1
2
3
4
5
6
7
8
9
10
11
12
13
14
package main

import (
"net/http"
"github.com/labstack/echo"
)

func main() {
e := echo.New()
e.GET("/", func(c echo.Context) error {
return c.String(http.StatusOK, "Hello, Echo World!!")
})
e.Logger.Fatal(e.Start(":8080"))
}

起動

Docker コンテナを起動する。

1
2
3
4
5
6
$ sudo docker-compose build --no-cache
$ sudo docker-compose up -d
$ sudo docker-compose ps
Name Command State Ports
--------------------------------------------------------------
echo_app_1 go run server.go Up 0.0.0.0:8080->8080/tcp

サーバーの起動を確認する。

1
2
$ curl http://localhost:8080/
Hello, Echo World!!

GET パラメーターを受けて JSON を返す

server.go を下記のように変更した。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
package main

import (
"net/http"
"github.com/labstack/echo"
)

type ItemData struct {
Id int `json:"id"`
Name string `json:"name"`
}

func main() {
e := echo.New()
e.GET("/", func(c echo.Context) error {
item := new(ItemData)
if err := c.Bind(item); err != nil {
return err
}
return c.JSON(http.StatusOK, item)
})
e.Logger.Fatal(e.Start(":8080"))
}

curl で GET リクエストを送ってみる。

1
2
$ curl "http://localhost:8099/?id=1&Name=product01"
{"id":1,"name":"product01"}