16

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

我有一个通过以下命令运行的基本 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相互交谈。谢谢。

4

1 回答 1

28

如果您在容器内运行服务,那么amqp://guest:guest@localhost对您没有任何好处;localhost指的是容器的网络命名空间......所以你当然会得到一个ECONNREFUSED,因为那里没有任何东西在听。

如果要连接到另一个容器中的服务,则需要使用该容器的 IP 地址,或者解析为该容器 IP 地址的主机名。

如果您在用户定义的网络中运行容器,那么 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选项来实现类似但不太灵活的效果,如此所述。

于 2016-11-12T14:18:42.590 回答