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

Connect a Thrift client to a Thrift server in separate docker containers on the same host

我正在尝试将 Thrift 客户端(client)连接到同一主机上的 Thrift 服务器(server);服务器和客户端必须在单独的 docker 容器中。

我正在使用 Apache Thrift 的 python 实现,Thriftpy v0.3.9。 host是Ubuntu16.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"

服务器运行成功。但是,客户端出现以下异常:

"Could not connect to %s" % str(地址)) thriftpy.transport.TTransportException:TTransportException(类型=1,消息="Could not connect to ('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'

目标是尝试从 thrift 客户端调用同一主机上的 thrift 服务器。因此,对于这个简单的学习示例,docker-compose 不是必需的。

首先,上面问题中使用的端口都是错误的。 thrift 客户端和 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 更容易。