我做了很多搜索,但我无法解决这个问题。
我有一个基本的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
。
什么是正确的方法?目的是将每项服务放在一个容器中,通过兔子互相交谈。感谢。
答案 0 :(得分:3)
如果您在容器内运行服务,那么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
选项来实现类似但不太灵活的效果,如文档{{3 }}