Skip to main content
 首页 » 编程设计

python之无法连接到在本地 Docker 容器中运行的 gRPC 服务

2024年11月24日30zdz8207

我确实阅读了 [this similar question][1] 的答案,但它并没有帮助我解决问题。

我的设置:

  • 远程 gRPC 服务;
  • 一个.py 直接在主机上运行的客户端。

在该配置中一切正常。但是,如果我开始 remote gRPC service在本地 Docker 容器中( .py 客户端仍在本地运行):

08:49:00.434005     7 server.cc:53] Server starting 
08:49:00.435603     7 server.cc:59] Server listening on 0.0.0.0:9000 

The command I use to run a gRPC service: sudo docker run --rm -it -u dud --net=host --entrypoint=/usr/local/bin/application COOL_APP

Here's a snippet of code of my .py client:

HOST = 'localhost' 
PORT = '9000' 
with grpc.insecure_channel('{}:{}'.format(HOST, PORT)) as channel: 

我收到以下错误(据我所知,这意味着我的 .py 客户端无法连接到我的 Docker 服务的 host:port):

Traceback (most recent call last): 
  File "client.py", line 31, in <module> 
    for record in reader: 
  File "/usr/local/lib/python2.7/site-packages/grpc/_channel.py", line 367, in next 
    return self._next() 
  File "/usr/local/lib/python2.7/site-packages/grpc/_channel.py", line 358, in _next 
    raise self 
grpc._channel._Rendezvous: <_Rendezvous of RPC that terminated with: 
    status = StatusCode.UNAVAILABLE 
    details = "Connect Failed" 
    debug_error_string = "{"created":"@1550567018.554830000","description":"Failed to create subchannel","file":"src/core/ext/filters/client_channel/client_channel.cc","file_line":2261,"referenced_errors":[{"created":"@1550567018.554828000","description":"Pick Cancelled","file":"src/core/ext/filters/client_channel/lb_policy/pick_first/pick_first.cc","file_line":245,"referenced_errors":[{"created":"@1550567018.554798000","description":"Connect Failed","file":"src/core/ext/filters/client_channel/subchannel.cc","file_line":867,"grpc_status":14,"referenced_errors":[{"created":"@1550567018.554789000","description":"Failed to connect to remote host: OS Error","errno":61,"file":"src/core/lib/iomgr/tcp_client_posix.cc","file_line":207,"os_error":"Connection refused","syscall":"connect","target_address":"ipv6:[::1]:9000"}]}]}]}" 

我试过同时设置 localhost:9000 , 0.0.0.0:9000 , 和 :9000在我的 .py客户端,它没有工作。

我不确定这是否有意义,但是当我运行时:

user-dev:~ user$ lsof -i tcp:8080 
COMMAND     PID  USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME 
myservice 53941 user    6u  IPv4 0x40c50fcf1d04701d      0t0  TCP localhost:http-alt (LISTEN) 
user-dev:~ user$ lsof -i tcp:9000 

即,我的终端没有显示 tcp:9000 的任何内容(我运行上面的命令来检查是否有东西真的在听 localhost:9000 )。

更新:当我运行 hello-world [容器][2] 与 -p 9000:9000我收到一个不同的错误:

debug_error_string = "{"created":"@1550580085.678869000","description":"Error received from peer","file":"src/core/lib/surface/call.cc","file_line":1036,"grpc_message":"Socket closed","grpc_status":14}" 
``` so I assume something is wrong with my gRPC service image / Docker flags. 
 
 
  [1]: https://stackoverflow.com/questions/43911793/cannot-connect-to-go-grpc-server-running-in-local-docker-container 
  [2]: https://github.com/crccheck/docker-hello-world 

请您参考如下方法:

需要告诉docker对外暴露端口。

尝试将 -p 9000:9000 添加到您的 docker run 命令中。