从另一个容器中的服务连接到 rabbitmq docker 容器
Connecting to rabbitmq docker container from service in another container
我进行了大量搜索,但无法解决此问题。
我有一个基本的 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)
此服务 运行s 并使用以下命令从我的主机连接到 rabbitmq:
nameko run main --broker amqp://guest:guest@localhost
我想将服务放入 Docker 容器(称为 service_one
)但是当我这样做并且 运行 之前的 nameko 命令我得到 socket.error: [Errno 111] ECONNREFUSED
没有不管我如何尝试 link 这两个容器。
正确的方法是什么?目的是将每个服务都放在一个容器中,所有服务都通过兔子相互交谈。谢谢。
如果您是 运行 容器内的服务,那么 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.
我进行了大量搜索,但无法解决此问题。
我有一个基本的 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)
此服务 运行s 并使用以下命令从我的主机连接到 rabbitmq:
nameko run main --broker amqp://guest:guest@localhost
我想将服务放入 Docker 容器(称为 service_one
)但是当我这样做并且 运行 之前的 nameko 命令我得到 socket.error: [Errno 111] ECONNREFUSED
没有不管我如何尝试 link 这两个容器。
正确的方法是什么?目的是将每个服务都放在一个容器中,所有服务都通过兔子相互交谈。谢谢。
如果您是 运行 容器内的服务,那么 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.