我正在尝试将Thrift客户端(客户端)连接到同一主机上的Thrift服务器(服务器);服务器和客户端必须位于单独的Docker容器中。
我正在使用Apache Thrift的python实现Thriftpy v0.3.9。主机是Ubuntu 16.04,Docker是版本18.06.0-ce,而docker-compose是版本1.17.0。我正在使用python:3.6.6-alpine3.8图片。
只要没有容器,我就可以成功地将客户端连接到同一主机上的服务器。但是,我需要将它们放在容器中。
我的docker-compose.yml:
version: "3"
services:
thrift_client:
build: .
ports:
- "6002:6000"
links:
- thrift_server
thrift_server:
image: thrift_server
ports:
- "6001:6000"
服务器成功运行。但是,客户端会产生以下异常:
“无法连接到%s”%str(addr)) thriftpy.transport.TTransportException:TTransportException(type = 1,message =“无法连接到('thrift_server',6000)”)
我正在跟踪下面链接的这个小演示,只有一点点偏差,以便使用docker进行操作。 https://thriftpy.readthedocs.io/en/latest/
我的pinpong.thrift文件:
service PingPong {
string ping(),
}
thrift_server.py:
import thriftpy
pingpong_thrift = thriftpy.load("pingpong.thrift", module_name="pingpong_thrift")
from thriftpy.rpc import make_server
class Dispatcher(object):
def ping(self):
return "pong"
server = make_server(pingpong_thrift.PingPong, Dispatcher(), 'localhost', 6000)
server.serve()
thrift_client.py:
import thriftpy
pingpong_thrift = thriftpy.load("pingpong.thrift", module_name="pingpong_thrift")
from thriftpy.rpc import make_client
client = make_client(pingpong_thrift.PingPong, 'thrift_server', 6000)
client.ping()
同样,这可以在主机上不使用Docker的情况下正常运行。当然,在没有Docker的情况下,我使用'localhost'代替'thrift_server'作为客户端。
答案 0 :(得分:1)
目标是尝试从Thrift客户端向同一主机上的Thrift服务器进行调用。因此,对于这个简单的学习示例,不需要docker-compose。
首先,上述问题中使用的端口都是错误的。 Thrift客户端和Thrift服务器都必须侦听主机上的同一端口。
因此,我将这一行替换为节俭的客户端
client = make_client(pingpong_thrift.PingPong, 'thrift_server', 6000)
到以下:
client = make_client(pingpong_thrift.PingPong, 'localhost', 6000)
Docker桥接器不允许2个或更多容器侦听同一端口。因此,我使用主机网络。据我了解,您可以在docker上连接Linux的主机网络(不确定Windows),但不能连接Mac。
无论如何,我只是做了以下事情:
$ docker run -it --network=host --name thrift_server_container -p=0.0.0.0:6000:6000 thrift_server python thrift_server.py
然后在另一个终端:
$ docker run -it --network=host --name thrift_client_container -p=0.0.0.0:6000:6000 thrift_client python
第二条命令会将您置于客户端的python repl中。然后,您可以在repl中启动thrift客户端的实例并ping thrift服务器。当然,您可以在第二个命令中运行thrift_client.py,但是我发现在repl中尝试使用thrift更容易。