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

Mar*_*lul 21 rabbitmq celery docker

我想在一个docker容器中运行rabbitmq-server,并使用celery从另一个容器连接到它(http://celeryproject.org/)

我使用以下命令运行rabbitmq ...

sudo docker run -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server
Run Code Online (Sandbox Code Playgroud)

并经过芹菜

sudo docker run -i -t markellul/celery /bin/bash
Run Code Online (Sandbox Code Playgroud)

当我尝试在http://docs.celeryproject.org/en/latest/getting-started/first-steps-with-celery.html上执行非常基本的教程来验证连接时

我收到连接拒绝错误:

consumer:无法连接到amqp://guest@127.0.0.1:5672 //:[Errno 111]连接被拒绝.

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

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

Alp*_*Alp 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
Run Code Online (Sandbox Code Playgroud)

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

docker network create -d bridge --subnet 172.25.0.0/16 mynetwork
Run Code Online (Sandbox Code Playgroud)

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

docker network connect mynetwork rabbitmq
docker network connect mynetwork celery
Run Code Online (Sandbox Code Playgroud)

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

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

[旧答案]

Docker 0.6.5中有一个名为链接新功能,用于帮助docker容器之间的通信.

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

docker run --name rabbitmq -d -p :5672 markellul/rabbitmq /usr/sbin/rabbitmq-server
Run Code Online (Sandbox Code Playgroud)

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

docker run --link rabbitmq:amq -i -t markellul/celery /bin/bash
Run Code Online (Sandbox Code Playgroud)

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

$AMQ_PORT_5672_TCP_ADDR
$AMQ_PORT_5672_TCP_PORT
Run Code Online (Sandbox Code Playgroud)

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

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

  • 这是链接服务和应用程序的正确方法 (3认同)

Val*_*tor 6

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

CONTAINER_IP=$(sudo docker inspect --format '{{ .NetworkSettings.IPAddress }}' $CONTAINER_ID)
echo $CONTAINER_IP
Run Code Online (Sandbox Code Playgroud)