从另一个容器中的服务连接到rabbitmq docker容器

2024-05-29 02:01:57 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经做了很多调查,但我不能解决这个问题。

我有一个基本的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相互通信。谢谢。


Tags: dockerrunname命令mainserviceargrabbitmq
1条回答
网友
1楼 · 发布于 2024-05-29 02:01:57

如果你在一个容器中运行一个服务,那么amqp://guest:guest@localhost对你没有任何好处;localhost指的是容器的网络名称空间…所以当然你会得到一个ECONNREFUSED,因为那里没有监听。

如果要连接到另一个容器中的服务,则需要使用该容器的ip地址或解析为该容器的ip地址的主机名。

如果在user-defined network中运行容器,Docker将维护一个DNS服务器,该服务器将容器名称映射到地址。也就是说,如果我首先创建一个网络:

docker network create myapp_net

然后在该网络中启动rabbitmq容器:

docker run -d --network myapp_net --hostname rabbitmqhost \
   --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:3-management

然后,在该网络中启动的其他容器将能够使用主机名rabbitmq连接到该容器。

对于在默认网络(命令行上没有--network参数)中运行的容器,可以使用--link选项来实现类似的效果,尽管不太灵活,如文档所述here

相关问题 更多 >

    热门问题