【问题标题】:Connect a Thrift client to a Thrift server in separate docker containers on the same host将 Thrift 客户端连接到同一主机上不同 docker 容器中的 Thrift 服务器
【发布时间】:2018-08-17 02:39:32
【问题描述】:

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

【问题讨论】:

  • 您的 YAML 缩进似乎已关闭。你能解决这个问题吗?
  • 我修好了。谢谢。
  • 如果在服务器代码中将’localhost’ 更改为’0.0.0.0’,它会按预期工作吗?
  • 是的,服务器代码可以改为“0.0.0.0”。您的建议促使我发现我在回答我自己的问题时提供的 docker 命令中存在错误。您必须在 docker 命令中使用“0.0.0.0”,或者我想是“127.0.0.1”,而不是显式使用“localhost”。相应地修正了答案。谢谢。
  • @szignal - 你找到解决方案了吗?我也有类似的情况。我有节俭的服务器和客户端。如果没有 docker,它可以正常工作,但如果服务器在容器中,客户端会收到 TSocker 读取 0 字节异常。

标签: python docker docker-compose thrift


【解决方案1】:

我们的目标是尝试从 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 for 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 更容易。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-14
    • 1970-01-01
    • 2017-08-20
    • 2018-06-08
    • 2012-05-23
    • 1970-01-01
    • 2014-07-01
    相关资源
    最近更新 更多