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

w6lpcovy  于 2021-06-20  发布在  Mysql
关注(0)|答案(7)|浏览(1015)

我想在一个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 安装在同一个容器上时,它可以正常工作。
我需要做什么才能让容器彼此交互?

qoefvg9y

qoefvg9y1#

我认为您不能直接通过设计连接到另一个容器-这将是主机的责任。这里给出了一个使用卷在容器之间共享数据的示例http://docs.docker.io/en/latest/examples/couchdb_data_volumes/但我不认为那是你想要的。
我最近发现https://github.com/toscanini/maestro -那可能适合你的需要。如果有,请告诉我们:),我自己还没试过。
编辑。注意,您可以在这里看到本机“容器布线和服务发现”在路线图上。我想最迟7.0或8.0。

afdcj2ne

afdcj2ne2#

您可以通过以下方式获取docker示例ip。。。

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

但这不是很有用。
可以使用管道在docker容器之间创建专用网络。

5uzkadbs

5uzkadbs3#

这是目前的0.8路线图:
https://github.com/dotcloud/docker/issues/1143

u2nhd7ah

u2nhd7ah4#

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

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

a0zr77ik5#

【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

现在,两个容器都在同一个网络中,可以相互通信。
在使用网络时可以找到非常详细的用户指南:连接容器。

[旧答案]

Docker0.6.5中有一个新特性叫做链接,它旨在帮助docker容器之间的通信。
首先,像往常一样创建rabbitmq容器。请注意,我还使用了新的“name”功能,使生活变得更轻松:

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

您可以使用link参数Map容器(我们在这里使用名称,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文档:
与/etc/hosts文件中的主机条目不同,如果重新启动源容器,则存储在环境变量中的ip地址不会自动更新。我们建议使用/etc/hosts中的主机条目来解析链接容器的ip地址。

im9ewurl

im9ewurl6#

当您指定-p5672时,docker所做的就是在主机上打开一个新端口,例如49,并将其转发到容器的端口5672。
通过运行以下命令,您应该能够看到哪个端口正在转发到容器:

sudo docker ps -a

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

amqp://guest@HOST_IP:49xxx

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

o3imoua4

o3imoua47#

创建图像:

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"

使用运行映像后创建的容器(imagename)连接网络:

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

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

docker network inspect ''networkname"

相关问题