当前位置: 首页 > 知识库问答 >
问题:

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

田镜
2023-03-14

我想在一个docker容器中运行Rabbitmq服务器,并使用芹菜从另一个容器连接到它(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安装在与芹菜相同的容器上时,它可以正常工作。

要使容器彼此交互,我需要做什么?

共有3个答案

裴威
2023-03-14

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

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

sudo docker ps -a

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

amqp://guest@HOST_IP:49xxx

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

和和煦
2023-03-14

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

CONTAINER_IP=$(sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' $CONTAINER_ID)
echo $CONTAINER_IP
水瀚漠
2023-03-14

现在不推荐使用直接链接。链接容器的新方法是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

现在,两个html" target="_blank">容器都在同一个网络中,可以相互通信。

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

Docker 0.6中有一个新功能。5称为链接,旨在帮助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/host文件中。在本例中amq将是容器中定义的主机。

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

 类似资料:
  • 我正在尝试从另一个码头工人容器连接到 kafka docker 容器。但它没有连接。 为了运行kafka和zookeeper,我使用了docker compose文件: 容器docker compose 17138956372294708100 _ kafkatest . producer _ 1和docker compose 17138956372294708100 _ kafkatest .

  • 问题内容: 我有应用程序,使用过Tornado和tornado-redis。我开始[redis]中的[image“ app” 然后我想将我的应用程序与redis链接: 我有错误: 我已经用本地tornado和redis测试了我的代码,并且可以正常工作。问题在 为什么我的应用无法连接到Redis容器?如何解决?我使用标准端口6379。 谢谢! 问题答案: 尝试在上使用redis 。(请参见此处的源代

  • 在Ubuntu 20.04上运行新的Docker 20.10.1。此版本包括对主机的支持。码头工人。Linux上dockerd中的内部 我在使用SSL证书的容器中运行了一系列服务,我想使用Telegraf(稍后发送到Grafana仪表板)检查证书是否过期。 所有带有网络接口和Telegraf的服务都运行在同一个Docker主机上。所有服务都在自己的网桥网络中。我想在端口9000上从Telegraf

  • 我有两张docker的照片。其中一个docker映像(来自第一个容器)在运行时会生成一些文件,这些文件需要由另一个容器使用。 我可以这样做吗?

  • 问题内容: 我基于两个不同的图像创建了两个docker容器。一个数据库,另一个用于网络服务器。这两个容器都在我的Mac OS X上运行。 我可以从主机访问数据库容器,也可以从主机访问Web服务器。 但是,如何从Web服务器访问数据库连接? 我启动数据库容器的方式是 我开始了wls容器作为 我可以通过连接到主机上的数据库 我可以以以下方式访问主机上的wls: 问题答案: 最简单的方法是使用–link

  • 我基于两个不同的映像创建了两个docker容器。一个是db,另一个是WebServer。这两个容器都在我的mac OSX上运行。 我可以从主机访问db容器,也可以从主机访问webserver。 我可以访问主机上的wls作为