我想在一个docker容器中运行rabbitmq-server,并使用celery从另一个容器连接到它(http://celeryproject.org/)
我使用以下命令运行rabbitmq ...
sudo docker run -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server
并经过芹菜
sudo docker run -i -t markellul/celery /bin/bash
当我尝试执行非常基本的教程来验证http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html上的连接
我收到连接拒绝错误:
consumer:无法连接到amqp://guest@127.0.0.1:5672 //:[Errno 111]连接被拒绝 .
当我在与芹菜相同的容器上安装rabbitmq时,它工作正常 .
我需要做些什么才能让容器相互交互?
6 回答
[编辑2016]
直接链接现已弃用 . 执行链接容器的新方法是docker network connect . 它与虚拟网络非常相似,并且具有比旧的链接方式更广泛的功能集 .
首先,您创建命名容器:
然后创建一个网络(最后一个参数是您的网络名称):
将容器连接到新创建的网络:
现在,两个容器都在同一个网络中,可以相互通信 .
可以在Work with networks: Connect containers找到非常详细的用户指南 .
[老回答]
有一个new feature in Docker 0.6.5 called linking,用于帮助docker容器之间的通信 .
首先,像往常一样创建rabbitmq容器 . 请注意,我还使用了新的“名称”功能,使生活更轻松:
您可以使用link参数映射容器(我们在这里使用名称,id也可以):
现在您可以访问rabbitmq容器的IP和端口,因为docker会自动添加一些环境变量:
此外,Docker将源容器的主机条目添加到
/etc/hosts
文件中 . 在此示例中,amq
将是容器中已定义的主机 .来自Docker documentation:
只需获取容器ip,然后从另一个容器连接到它:
当您指定-p 5672时,docker所做的是在主机上打开一个新端口,例如49xxx,并将其转发到容器的端口5672 .
您应该能够通过运行来查看哪个端口转发到容器:
从那里,您可以直接连接到主机IP地址,如下所示:
您不能使用localhost,因为每个容器基本上都是它自己的localhost .
我认为你无法通过设计直接连接到另一个容器 - 这将是主机的责任 . 这里给出了一个使用Volumes在容器之间共享数据的示例http://docs.docker.io/en/latest/examples/couchdb_data_volumes/,但我没有找到't think that that is what you' .
我最近发现了https://github.com/toscanini/maestro - 这可能适合您的需求 . 让我们知道它是否:),我还没有尝试过 .
编辑 . 请注意,您可以阅读路线图中的本机"Container wiring and service discovery"的here . 我最迟估计是7.0或8.0 .
您可以使用...获取docker实例IP
但那不是很有用 .
您可以使用pipework在docker容器之间创建专用网络 .
目前这是0.8路线图:
https://github.com/dotcloud/docker/issues/1143