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

Python 从另一个容器中的服务连接到rabbitmq docker容器,python,docker,rabbitmq,nameko,Python,Docker,Rabbitmq,Nameko,我已经做了很多搜索,但我无法解决这个问题 我有一个通过以下命令运行的基本Rabbitmq容器: docker run-d--hostname rabbitmqhost--name rabbitmq-p 15672:15672-p 5672 rabbitmq:3-management 我正在使用nameko创建一个连接到此容器的微服务。下面是一个基本的微服务模块main.py: from nameko.rpc import rpc class Service_Name(object): n

我已经做了很多搜索,但我无法解决这个问题

我有一个通过以下命令运行的基本Rabbitmq容器:

docker run-d--hostname rabbitmqhost--name rabbitmq-p 15672:15672-p 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运行主代理amqp://guest:guest@本地主机

我想将服务放入Docker容器(称为
service\u one
)中,但当我这样做并运行上一个nameko命令时,我得到了
socket.error:[Errno 111]econnreflused
,无论我如何尝试链接这两个容器


正确的方法是什么?其目的是将每个服务都放在一个容器中,通过rabbit相互通信。谢谢。

如果您在容器中运行服务,那么
amqp://guest:guest@localhost
对您没有任何好处
localhost
指的是容器的网络名称空间……因此您当然会得到一个
econnrefered
,因为那里没有任何侦听内容

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

如果您在中运行容器,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
选项来实现类似的效果,尽管灵活性较低。

“无论我如何尝试链接两个容器…”您尝试了什么?我尝试了链接和网络,事实证明,我得到的每个方法的ampq连接值都有点错误。(我使用的是localhost而不是AMQ_PORT_5672_TCP_ADDR等)。谢谢。我最终使用--link将每个服务容器连接到rabbit,尽管我很欣赏上面提到的是新的标准方法。我只想强调Docker网络解决方案的一个优点:当使用
--link
时,如果停止rabbitmq容器,你的应用程序就不走运了:你无法“重新链接”启动新rabbitmq容器后的容器。另一方面,使用依赖dns进行名称解析的Docker networks,如果您启动一个与新容器同名的新容器,您的服务可能能够恢复(假设您的应用程序代码能够优雅地处理断开连接)。啊,这是一个非常好的观点,谢谢。如果我使用网络解决方案,rabbit的地址和端口是什么?i、 e.等效于
AMQ\u PORT\u 5672\u TCP\u ADDR
AMQ\u PORT\u 5672\u TCP\u PORT
的地址将只是容器的名称(
--name…
)(Docker维护一个将容器名称映射到地址的DNS服务器)。没有与AMQ_端口(u 5672)TCP_端口(u TCP_PORT)等效的端口,但一般来说这不是问题。很好,再次感谢。我现在唯一的问题是,当我的Flask应用程序的容器连接到该网络时,我无法再访问该应用程序(0.0.0.0:5000),有什么想法吗?