尝试使用grpc连接到Docker容器时出错

时间:2018-07-18 01:24:00

标签: docker go networking protocol-buffers grpc

我尝试使用golang grpc连接到Docker容器,但遇到以下问题。我使用的操作系统是Linux。

我的.proto文件显示如下:

syntax = "proto3"; 
package reverse;
service Reverse {
    rpc Do(Request) returns (Response) {}
}
message Request {
    string message = 1;
}
message Response {
    string message = 1;
}

客户端main.go:

func main() {
    opts := []grpc.DialOption{
        grpc.WithInsecure(),
        grpc.WithBlock(),
    }
    args := os.Args
    conn, err := grpc.Dial("127.0.0.1:5300", opts...)
    if err != nil {
        grpclog.Fatalf("fail to dial: %v", err)
    }
    defer conn.Close()
    log.Info("Connect finished")
    client := pb.NewReverseClient(conn)
    request := &pb.Request{
        Message: args[1],
    }
    response, err := client.Do(context.Background(), request)
    if err != nil {
        grpclog.Fatalf("fail to dial: %v", err)
    }
    fmt.Println(response.Message)
}

服务器main.go:

func main() {
    listener, err := net.Listen("tcp", ":5300")
    if err != nil {
        grpclog.Fatalf("failed to listen: %v", err)
    }
    opts := []grpc.ServerOption{}
    grpcServer := grpc.NewServer(opts...)
    pb.RegisterReverseServer(grpcServer, &server{})
    grpcServer.Serve(listener)
}
type server struct{}
func (s *server) Do(c context.Context, request *pb.Request) (response *pb.Response, err error) {
    n := 0
    rune := make([]rune, len(request.Message))
    for _, r := range request.Message {
        rune[n] = r
        n++
    }
    rune = rune[0:n]
    for i := 0; i < n/2; i++ {
        rune[i], rune[n-1-i] = rune[n-1-i], rune[i]
    }
    output := string(rune)
    response = &pb.Response{
        Message: output,
    }
    return response, nil    
}

期望客户端可以接收命令行参数传递的字符串的相反内容。这工作正常,我尝试将服务器打包到docker映像中。 Dockerfile:

FROM scratch
ADD . /bin/
ENTRYPOINT ["/bin/server"]
EXPOSE 5300

这是我的问题:当我使用参数-p 5300:5300运行docker容器时,可以返回正确的值。现在,我运行了没有端口映射的容器。我通过docker inspect找到了该容器的IP地址,它的地址是172.17.0.2。然后,将Client main.go中grpc.Dial函数中的IP地址更改为172.17.0.2。我再次运行客户端,发现程序卡在client.Do函数中。所以我想问的是如何使用直接IP地址连接到Docker容器?

0 个答案:

没有答案