从另一个容器中的服务连接到rabbitmq泊坞窗容器

从另一个容器中的服务连接到rabbitmq泊坞窗容器

问题描述:

我已经完成了大量搜索,但无法解决此问题。从另一个容器中的服务连接到rabbitmq泊坞窗容器

我通过这个命令有一个基本的RabbitMQ的容器中运行:

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

我使用nameko创造它连接到这个容器中的微服务。这是一个基本的microService模块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:[email protected]

我希望把服务为一体的码头工人容器(称为service_one),但是当我这样做并运行以前的nameko命令时,无论我如何尝试链接两个容器,我都会得到socket.error: [Errno 111] ECONNREFUSED

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

+0

“无论我如何尝试链接两个容器...”你有什么尝试? – larsks

+0

我试过链接和网络,结果我得到ampq连接值每个方法都有点不对。 (我使用本地主机而不是AMQ_PORT_5672_TCP_ADDR等)。 – steve

如果你正在一个容器内运行一个服务,那么amqp://guest:[email protected]不会对你有什么好处; 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

+0

谢谢。我最终使用--link将每个服务容器连接到兔子,尽管我明白上述是新的标准方式。 – steve

+1

我只是想强调Docker网络解决方案的一个优点:当使用'--link'时,如果你停止你的rabbitmq容器,你的应用程序运气不好:在启动一个新的rabbitmq后你不能“重新链接”容器容器。另一方面,使用依赖dns进行名称解析的Docker网络,如果您启动一个与新容器名称相同的新容器,则您的服务可能会恢复(假定您的应用程序代码正常处理断开连接) 。 – larsks

+0

啊,这很好,谢谢。如果我使用网络解决方案,兔子的地址和端口是什么?即相当于'AMQ_PORT_5672_TCP_ADDR'和'AMQ_PORT_5672_TCP_PORT' – steve