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

时间:2013-08-27 07:57:20

标签: rabbitmq celery docker

我想在一个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

上的连接时

我收到连接拒绝错误:

  

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

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

让容器相互交互需要做些什么?

7 个答案:

答案 0 :(得分:77)

[编辑2016]

现在不推荐使用直接链接。链接容器的新方法是docker network connect。它与虚拟网络非常相似,并且具有比旧的链接方式更广泛的功能集。

首先创建命名容器:

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

然后您创建一个网络(最后一个参数是您的网络名称):

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

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

docker network connect mynetwork rabbitmq
docker network connect mynetwork celery

现在,两个容器都在同一个网络中,可以相互通信。

可以在Work with networks: Connect containers找到非常详细的用户指南。

[旧答案]

有一个new feature in Docker 0.6.5 called linking,用于帮助docker容器之间的通信。

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

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

您可以使用link参数映射容器(我们在这里使用名称,id也可以):

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

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

$AMQ_PORT_5672_TCP_ADDR
$AMQ_PORT_5672_TCP_PORT

此外,Docker将源容器的主机条目添加到/etc/hosts文件中。在此示例中,amq将是容器中已定义的主机 来自Docker documentation

  

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:3)

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

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

sudo docker ps -a

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

amqp://guest@HOST_IP:49xxx

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

答案 3 :(得分:1)

我认为你无法通过设计直接连接到另一个容器 - 这将是主机的责任。使用Volumes在容器之间共享数据的示例在此处http://docs.docker.io/en/latest/examples/couchdb_data_volumes/给出,但我认为这不是您正在寻找的。

我最近发现了https://github.com/toscanini/maestro - 这可能符合您的需求。如果它确实:)请告诉我们,我还没有尝试过。


编辑。请注意,您可以阅读here本地“容器布线和服务发现”在路线图上。我最迟估计是7.0或8.0。

答案 4 :(得分:1)

您可以使用...

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

但那不是很有用。

您可以使用pipework在泊坞窗容器之间创建专用网络。

答案 5 :(得分:1)

创建图像:

 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"

使用运行图像后创建的容器(图像名称)连接网络:

docker network connect "networkname" "imagename1"
docker network connect "networkname" "imagename2"

我们可以向网络添加任意数量的容器。

docker network inspect ''networkname"

答案 6 :(得分:0)

这是目前的0.8路线图:

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