在同一主机上的单独 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 更容易。
我正在尝试将 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 更容易。