我尝试使用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容器?