将Thrift客户端连接到同一主机上单独docker容器中的Thrift服务器

时间:2018-07-29 08:52:54

标签: python docker docker-compose thrift

我正在尝试将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'作为客户端。

1 个答案:

答案 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更容易。