gRPC-GatewayのtutorialsをDockerでやってみる
はじめに
gRPC-Gatewayのtutorialsをコンテナで動かして疎通できるようにしたいと考えています。
作業リポジトリ: 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を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"}