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

我想在一个docker容器中运行rabbitmq-server并使用芹菜( 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 

当我试图做非常基本的教程来validationhttp://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html上的连接

我得到一个连接拒绝错误:

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

当我在芹菜相同的容器上安装rabbitmq,它工作正常。

我需要做什么才能使容器互相交互?

[编辑2016]

现在直接链接已被弃用。 链接容器的新方法是dockernetworking连接 。 它与虚拟networking非常相似,比旧的连接方式具有更广泛的function集。

首先你创build你的命名容器:

 docker run --name rabbitmq -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server docker run --name celery -it markellul/celery /bin/bash 

然后你创build一个networking(最后一个参数是你的networking名称):

 docker network create -d bridge --subnet 172.25.0.0/16 mynetwork 

将容器连接到新创build的networking:

 docker network connect mynetwork rabbitmq docker network connect mynetwork celery 

现在,两个容器都在同一个networking中,并且可以相互通信。

使用networking可以find非常详细的用户指南:连接容器 。

[老回答]

Docker 0.6.5中有一个新的特性叫做连接 ,它是为了帮助Docker容器之间的通信。

首先,照常创build你的rabbitmq容器。 请注意,我还使用了新的“名称”function,使生活轻松一点:

 docker run --name rabbitmq -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server 

你可以使用链接参数来映射一个容器(我们在这里使用的名字,ID也可以):

 docker run --link rabbitmq:amq -i -t markellul/celery /bin/bash 

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

 $AMQ_PORT_5672_TCP_ADDR $AMQ_PORT_5672_TCP_PORT 

此外,Docker将源容器的主机条目添加到/etc/hosts文件。 在这个例子中, amq将是容器中定义的主机。
从Docker 文档 :

与/ etc / hosts文件中的主机条目不同,如果源容器重新启动,则存储在环境variables中的IP地址不会自动更新。 我们build议使用/ etc / hosts中的主机条目来parsing链接的容器的IP地址。

只要让你的容器IP,并从另一个容器连接到它:

 CONTAINER_IP=$(sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' $CONTAINER_ID) echo $CONTAINER_IP 

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

你应该能够看到哪个端口转发到容器通过运行:

 sudo docker ps -a 

从那里,你可以直接连接到主机IP地址,如下所示:

 amqp://guest@HOST_IP:49xxx 

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

我认为你不能直接通过devise连接到另一个容器 – 这将是主机的责任。 使用卷在容器之间共享数据的一个例子在这里给出http://docs.docker.io/en/latest/examples/couchdb_data_volumes/ ,但我不认为这就是你要找的东西。

我最近发现了有关https://github.com/toscanini/maestro – 可能适合您的需求。 让我们知道如果它:),我还没有尝试过自己呢。


编辑。 请注意,您可以在这里阅读本地“集装箱布线和服务发现”路线图。 我猜最迟是7.0或8.0。

这是目前在0.8的路线图上:

https://github.com/dotcloud/docker/issues/1143

你可以得到docker实例IP …

 CID=$(sudo docker run -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server); sudo docker inspect $CID | grep IPAddress 

但是这不是很有用。

您可以使用pipe道在Docker容器之间创build专用networking。