我想在一个docker容器中运行rabbitmq服务器,并使用celery 从另一个容器连接到它(http://celeryproject.org/)
我使用下面的命令运行rabbitmq。。。
sudo docker run -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server
把celery 通过
sudo docker run -i -t markellul/celery /bin/bash
当我试图做一个非常基本的教程来验证http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html
我收到一个连接被拒绝的错误:
使用者:无法连接到amqp://guest@127.0.0.1:5672//:[errno 111]连接被拒绝。
当我把rabbitmq和celery 安装在同一个容器上时,它可以正常工作。
我需要做什么才能让容器彼此交互?
7条答案
按热度按时间qoefvg9y1#
我认为您不能直接通过设计连接到另一个容器-这将是主机的责任。这里给出了一个使用卷在容器之间共享数据的示例http://docs.docker.io/en/latest/examples/couchdb_data_volumes/但我不认为那是你想要的。
我最近发现https://github.com/toscanini/maestro -那可能适合你的需要。如果有,请告诉我们:),我自己还没试过。
编辑。注意,您可以在这里看到本机“容器布线和服务发现”在路线图上。我想最迟7.0或8.0。
afdcj2ne2#
您可以通过以下方式获取docker示例ip。。。
但这不是很有用。
可以使用管道在docker容器之间创建专用网络。
5uzkadbs3#
这是目前的0.8路线图:
https://github.com/dotcloud/docker/issues/1143
u2nhd7ah4#
只需获取容器ip,并从另一个容器连接到它:
a0zr77ik5#
【2016年编辑】
现在不推荐使用直接链接。连接容器的新方法是docker network connect。它的工作原理与虚拟网络非常相似,并且比旧的链接方式具有更广泛的功能集。
首先创建命名容器:
然后创建一个网络(最后一个参数是网络名称):
将容器连接到新创建的网络:
现在,两个容器都在同一个网络中,可以相互通信。
在使用网络时可以找到非常详细的用户指南:连接容器。
[旧答案]
Docker0.6.5中有一个新特性叫做链接,它旨在帮助docker容器之间的通信。
首先,像往常一样创建rabbitmq容器。请注意,我还使用了新的“name”功能,使生活变得更轻松:
您可以使用link参数Map容器(我们在这里使用名称,id也可以):
现在您可以访问rabbitmq容器的ip和端口,因为docker自动添加了一些环境变量:
此外,docker将源容器的主机条目添加到
/etc/hosts
文件。在这个例子中amq
将是容器中定义的主机。来自docker文档:
与/etc/hosts文件中的主机条目不同,如果重新启动源容器,则存储在环境变量中的ip地址不会自动更新。我们建议使用/etc/hosts中的主机条目来解析链接容器的ip地址。
im9ewurl6#
当您指定-p5672时,docker所做的就是在主机上打开一个新端口,例如49,并将其转发到容器的端口5672。
通过运行以下命令,您应该能够看到哪个端口正在转发到容器:
从那里,您可以直接连接到主机ip地址,如下所示:
不能使用localhost,因为每个容器基本上都是自己的localhost。
o3imoua47#
创建图像:
运行docker映像:
创建网络:
使用运行映像后创建的容器(imagename)连接网络:
我们可以向网络中添加任意数量的容器。