26

我想在一个 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 安装在与 celery 相同的容器上时,它工作正常。

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

4

7 回答 7

80

[编辑 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

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

可以在使用网络:连接容器中找到非常详细的用户指南。

[老答案]

Docker 0.6.5 中有一个新特性叫做 linking ,旨在帮助 docker 容器之间的通信。

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

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 和 Port,因为 docker 自动添加了一些环境变量:

$AMQ_PORT_5672_TCP_ADDR
$AMQ_PORT_5672_TCP_PORT

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

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

于 2013-11-26T12:50:52.587 回答
6

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

CONTAINER_IP=$(sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' $CONTAINER_ID)
echo $CONTAINER_IP
于 2014-01-25T00:38:34.370 回答
3

当你指定 -p 5672 时,docker 所做的就是在宿主机上开辟一个新的端口,比如 49xxx,然后转发到容器的 5672 端口。

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

sudo docker ps -a

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

amqp://guest@HOST_IP:49xxx

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

于 2013-08-27T23:05:44.740 回答
1

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

我最近发现了https://github.com/toscanini/maestro - 这可能适合您的需求。让我们知道是否可以:),我自己还没有尝试过。


编辑。请注意,您可以在此处阅读本机“容器连接和服务发现”在路线图上。我猜最迟是 7.0 或 8.0。

于 2013-08-27T16:04:14.500 回答
1

您可以使用...获取 docker 实例 IP

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

但这不是很有用。

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

于 2013-09-12T07:30:42.520 回答
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"
于 2020-02-27T10:23:28.333 回答
0

这目前在 0.8 路线图上:

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

于 2013-09-10T07:39:02.223 回答