gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-30 02:27:36 25 4
gpt4 key购买 nike

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

我有一个通过此命令运行的基本 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 无论我如何尝试链接这两个容器。

正确的方法是什么?目的是将每个服务都放在一个容器中,所有服务都通过兔子相互交谈。谢谢。

最佳答案

如果您在容器内运行服务,那么 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 .

关于python - 从另一个容器中的服务连接到 rabbitmq docker 容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40563469/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com