我想在一个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时,它可以正常工作。
让容器相互交互需要做些什么?
答案 0 :(得分:77)
现在不推荐使用直接链接。链接容器的新方法是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/给出,但我认为这不是您正在寻找的。 p>
我最近发现了https://github.com/toscanini/maestro - 这可能符合您的需求。如果它确实:)请告诉我们,我还没有尝试过。
编辑。请注意,您可以阅读here本地“容器布线和服务发现”在路线图上。我最迟估计是7.0或8.0。
答案 4 :(得分:1)
您可以使用...
获取docker实例IPCID=$(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路线图: