【问题标题】:Connecting to rabbitmq docker container from service in another container从另一个容器中的服务连接到 rabbitmq docker 容器
【发布时间】:2016-11-12 13:43:59
【问题描述】:

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

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

【问题讨论】:

  • “无论我如何尝试链接这两个容器......”你有什么尝试?
  • 我尝试了链接和网络,结果发现每种方法的 ampq 连接值都略有错误。 (我使用的是 localhost 而不是 AMQ_PORT_5672_TCP_ADDR 等)。

标签: python docker rabbitmq nameko


【解决方案1】:

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

【讨论】:

  • 谢谢。我最终使用 --link 将每个服务容器连接到 rabbit,尽管我很欣赏以上是新的标准方式。
  • 我只是想强调一下 Docker 网络解决方案的一个优势:当使用 --link 时,如果你停止了 rabbitmq 容器,你的应用程序就不走运了:你不能“重新链接”容器在启动一个新的 rabbitmq 容器之后。另一方面,使用依赖 dns 进行名称解析的 Docker 网络,如果您启动一个与新容器同名的新容器,您的服务可能能够恢复(假设您的应用程序代码可以优雅地处理断开连接) .
  • 啊,这是一个很好的观点,谢谢。如果我使用网络解决方案,rabbit 的地址和端口是什么?即相当于AMQ_PORT_5672_TCP_ADDRAMQ_PORT_5672_TCP_PORT
  • 地址将只是容器的名称 (--name ...)(Docker 维护一个将容器名称映射到地址的 DNS 服务器)。没有等同于AMQ_PORT_5672_TCP_PORT,但总的来说这不是问题。
  • 太好了,再次感谢。我现在唯一的问题是,当应用程序的容器连接到该网络时,我无法再访问我的 Flask 应用程序(在 0.0.0.0:5000),有什么想法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-24
  • 2019-07-20
  • 2017-10-15
  • 2020-04-25
  • 2020-01-30
相关资源
最近更新 更多