Rabbitmq 从一个Docker容器连接到另一个容器

Rabbitmq 从一个Docker容器连接到另一个容器,rabbitmq,celery,docker,Rabbitmq,Celery,Docker,我想在一个docker容器中运行rabbitmq服务器,并使用芹菜()从另一个容器连接到它 我已使用以下命令运行rabbitmq sudo docker run -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server 然后通过 sudo docker run -i -t markellul/celery /bin/bash 当我试图做非常基本的教程来验证 我收到一个连接被拒绝错误: 消费者:无法连接到amqp://guest@127.

我想在一个docker容器中运行rabbitmq服务器,并使用芹菜()从另一个容器连接到它

我已使用以下命令运行rabbitmq

sudo docker run -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server
然后通过

sudo docker run -i -t markellul/celery /bin/bash
当我试图做非常基本的教程来验证

我收到一个连接被拒绝错误:

消费者:无法连接到amqp://guest@127.0.0.1:5672/:[Errno 111] 连接被拒绝

当我将rabbitmq安装在与芹菜相同的容器上时,它可以正常工作


要让容器彼此交互,我需要做什么?

我认为您不能通过设计直接连接到另一个容器-这将是主机的责任。这里给出了一个使用在容器之间共享数据的示例,但我认为这不是您想要的

我最近发现-这可能适合你的需要。如果有,请告诉我们:),我自己还没有试过



编辑。注意,您可以看到本机“容器连接和服务发现”在路线图上。我猜最晚是7.0或8.0。

当您指定-p 5672时,docker所做的是打开一个新端口,例如主机上的49xxx,并将其转发到容器的端口5672

通过运行以下命令,您应该能够看到哪个端口正在转发到容器:

sudo docker ps -a
从那里,您可以直接连接到主机IP地址,如下所示:

amqp://guest@HOST_IP:49xxx

您不能使用localhost,因为每个容器基本上都是自己的localhost。

这是当前的0.8路线图:


您可以使用

CID=$(sudo docker run -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server); sudo docker inspect $CID | grep IPAddress
但这不是很有用

您可以使用在docker容器之间创建专用网络。

[编辑2016] 现在不推荐使用直接链接。链接容器的新方法是。它的工作原理与虚拟网络非常相似,并且比旧的链接方式具有更广泛的功能集

首先创建命名容器:

docker run --name rabbitmq -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server
docker run --name celery -it markellul/celery /bin/bash
然后创建网络(最后一个参数是网络名称):

将容器连接到新创建的网络:

docker network connect mynetwork rabbitmq
docker network connect mynetwork celery
现在,两个容器位于同一个网络中,可以相互通信

有关详细的用户指南,请访问

[旧答案] 有一个用于帮助docker容器之间通信的

首先,像往常一样创建rabbitmq容器。请注意,我还使用了新的“名称”功能,这使生活变得更加轻松:

docker run --name rabbitmq -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server
您可以使用link参数映射容器(我们在这里使用名称,id也可以):

现在您可以访问rabbitmq容器的IP和端口,因为docker自动添加了一些环境变量:

$AMQ_PORT_5672_TCP_ADDR
$AMQ_PORT_5672_TCP_PORT
此外,Docker将源容器的主机条目添加到
/etc/hosts
文件中。在本例中,
amq
将是容器中定义的主机。
来自Docker:

与/etc/hosts文件中的主机条目不同,如果重新启动源容器,则存储在环境变量中的IP地址不会自动更新。建议使用/etc/hosts中的主机条目解析链接容器的IP地址


只需获取容器ip,并从另一个容器连接到它:

CONTAINER_IP=$(sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' $CONTAINER_ID)
echo $CONTAINER_IP
创建图像:

 docker build -t "imagename1" .
 docker build -t "imagename2" .
运行Docker映像:

docker run -it -p 8000:8000 --name=imagename1 imagename1
docker run -it -p 8080:8080 --name=imagename2 imagename2
创建网络:

docker network create -d bridge "networkname"
使用运行映像后创建的容器(imagename)连接网络:

docker network connect "networkname" "imagename1"
docker network connect "networkname" "imagename2"
我们可以向网络添加任意数量的容器

docker network inspect ''networkname"

你能自动获取主机IP吗?@amattn你在容器中安装了ifconfig吗?容器通常不需要它。。。我几乎总是在主机上安装它。那么如何将它传递给容器呢?我想这将很好地完成这行信息:)ifconfig列出了一大堆信息。可能会有标志来获取主机,但我只是运行ifconfig,然后将ip地址复制粘贴到需要的位置。maestro的有趣之处在于,他们有一个示例todos应用程序,它将节点容器连接到mongodb容器。今天,我正在调查node应用程序如何找到mongodb one。您的答案是很棒的@alp,因为您更新了它,我还想提到Docker Compose作为一个长期解决方案。Docker Compose是一个用于引导和运行的伟大工具,但并不完全在这个问题的范围内。谢谢。
docker network connect "networkname" "imagename1"
docker network connect "networkname" "imagename2"
docker network inspect ''networkname"