从另一个容器中的服务连接到rabbitmq泊坞窗容器
我做了很多search,但我无法解决这个问题。
我有一个基本的Rabbitmq容器通过这个命令运行:
docker run -d --hostname rabbitmqhost --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:3-management
我使用nameko
创build一个连接到这个容器的微服务。 这是一个基本的微服务模块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
不pipe我如何尝试并链接两个容器。
什么是正确的方法? 目的是让每个服务都在一个容器中,通过兔子互相交谈。 谢谢。
如果你正在一个容器中运行一个服务,那么amqp://guest:guest@localhost
不会对你有什么好处; localhost
指的是容器的networking名称空间…所以当然你会得到一个ECONNREFUSED
,因为这里没有任何东西在监听。
如果要连接到另一个容器中的服务,则需要使用该容器的IP地址或parsing为该容器的IP地址的主机名。
如果您正在用户定义的networking中运行容器,那么Docker会维护一个DNS服务器,将容器名称映射到地址。 也就是说,如果我第一次创build一个networking:
docker network create myapp_net
然后在该networking中启动一个rabbitmq容器:
docker run -d --network myapp_net --hostname rabbitmqhost \ --name rabbitmq -p 15672:15672 -p 5672:5672 rabbitmq:3-management
然后在该networking中启动的其他容器将能够使用主机名rabbitmq
连接到该容器。
对于在默认networking中运行的容器(在命令行上没有--network
参数),可以使用--link
选项来实现类似但不太灵活的效果,如此处所述 。