我已经做了很多调查,但我不能解决这个问题。
我有一个基本的Rabbitmq容器通过以下命令运行:
docker run -d --hostname rabbitmqhost --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:3-management
我正在使用nameko
创建连接到此容器的微服务。下面是一个基本的微服务模块main.py
:
from nameko.rpc import rpc
class Service_Name(object):
name = "service_name"
@rpc
def service_endpoint(self, arg=None):
logging.info('service_one endpoint, arg = %s', arg)
此服务运行并通过以下命令从我的主机连接到rabbitmq:
nameko run main --broker amqp://guest:guest@localhost
我想把服务放到Docker容器(称为service_one
)中,但是当我这样做并运行前面的nameko命令时,无论我如何尝试并链接这两个容器,我都会得到socket.error: [Errno 111] ECONNREFUSED
。
正确的方法是什么?其目的是将每个服务放在一个容器中,所有服务都通过rabbit相互通信。谢谢。
如果你在一个容器中运行一个服务,那么
amqp://guest:guest@localhost
对你没有任何好处;localhost
指的是容器的网络名称空间…所以当然你会得到一个ECONNREFUSED
,因为那里没有监听。如果要连接到另一个容器中的服务,则需要使用该容器的ip地址或解析为该容器的ip地址的主机名。
如果在user-defined network中运行容器,Docker将维护一个DNS服务器,该服务器将容器名称映射到地址。也就是说,如果我首先创建一个网络:
然后在该网络中启动rabbitmq容器:
然后,在该网络中启动的其他容器将能够使用主机名
rabbitmq
连接到该容器。对于在默认网络(命令行上没有
--network
参数)中运行的容器,可以使用--link
选项来实现类似的效果,尽管不太灵活,如文档所述here。相关问题 更多 >
编程相关推荐