hisamounaのブログ

アウトプットを習慣化するためのブログ

gRPC-GatewayのtutorialsをDockerでやってみる

はじめに

gRPC-Gatewaytutorialsをコンテナで動かして疎通できるようにしたいと考えています。

作業リポジトリ: grpc-gateway-tutorial

tutorialsをもとにserverとgatewayでエントリーポイントを分離

serverのmain.go

func main() {
    lis, err := net.Listen("tcp", ":8080")
    if err != nil {
        log.Fatal("Failed to listen", err)
    }

    s := grpc.NewServer()
    helloworldpb.RegisterGreeterServer(s, &server{})
    log.Println("Serving gRPC on 0.0.0.0:8080")
    log.Fatal(s.Serve(lis))
}

gatewayのmain.go

func main() {
    conn, err := grpc.DialContext(
        context.Background(),
        "0.0.0.0:8080",
        grpc.WithBlock(),
        grpc.WithInsecure(),
    )
    if err != nil {
        log.Fatalln("Failed to dial server: ", err)
    }

    gwmux := runtime.NewServeMux()
    // Register Greeter
    err = helloworldpb.RegisterGreeterHandler(context.Background(), gwmux, conn)
    if err != nil {
        log.Fatalln("Failed to register gateway:", err)
    }

    gwServer := &http.Server{
        Addr:    ":8090",
        Handler: gwmux,
    }

    log.Println("Serving gRPC-Gateway on http://0.0.0.0:8090")
    log.Fatalln(gwServer.ListenAndServe())
}

ホスト上でそれぞれgo runして、疎通確認OK

└─> go run cmd/server/main.go
2021/08/02 23:30:10 Serving gRPC on 0.0.0.0:8080

└─> go run cmd/gateway/main.go
2021/08/02 23:30:17 Serving gRPC-Gateway on http://0.0.0.0:8090

└─> curl -X POST -k http://localhost:8090/v1/example/echo -d '{"name": " hello"}'
{"message":" hello world"}%

コンテナ化したところcurlが通らなくなった

└─> docker compose up -d --build
[+] Running 2/2
 ⠿ Container gateway  Started                                                                                                                           5.2s
 ⠿ Container server   Started

└─> docker ps
CONTAINER ID   IMAGE                           COMMAND      CREATED          STATUS         PORTS                    NAMES
d5def9f4fcc6   grpc-gateway-tutorial_gateway   "/gateway"   14 seconds ago   Up 9 seconds   0.0.0.0:8090->8090/tcp   gateway
54ad371b15f7   grpc-gateway-tutorial_server    "/server"    14 seconds ago   Up 7 seconds   0.0.0.0:8080->8080/tcp   server

└─> curl -X POST -k http://localhost:8090/v1/example/echo -d '{"name": " hello"}'
curl: (52) Empty reply from server

gatewayコンテナの/etc/hostsを確認

distrolessのdebug方法はこれから勉強します、、、

└─> docker cp gateway:/etc/hosts gateway_hosts

└─> cat gateway_hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.20.0.2  d5def9f4fcc6

serverコンテナ(d5def9f4fcc6)のIPアドレスは172.20.0.2

0.0.0.0だと127.0.0.1に対して通信しに行くので、serverコンテナへはリクエストがいかない。

参考 0.0.0.0にはアクセスしないこと

0.0.0.0をserverに修正

  conn, err := grpc.DialContext(
        context.Background(),
        "server:8080",
        grpc.WithBlock(),
        grpc.WithInsecure(),
    )

期待通り gateway -> serverの通信が通るように

└─> docker compose up -d --force-recreate --build

└─> curl -X POST -k http://localhost:8090/v1/example/echo -d '{"name": " hello"}'
{"message":" hello world"}