首页 文章

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

提问于
浏览
19

我想在一个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上的连接

我收到连接拒绝错误:

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

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

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

6 回答

  • 0

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

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

    可以在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

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

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

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

    您应该能够通过运行来查看哪个端口转发到容器:

    sudo docker ps -a
    

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

    amqp://guest@HOST_IP:49xxx
    

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

  • 3

    我认为你无法通过设计直接连接到另一个容器 - 这将是主机的责任 . 这里给出了一个使用Volumes在容器之间共享数据的示例http://docs.docker.io/en/latest/examples/couchdb_data_volumes/,但我没有找到't think that that is what you' .

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


    编辑 . 请注意,您可以阅读路线图中的本机"Container wiring and service discovery"的here . 我最迟估计是7.0或8.0 .

  • 5

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

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

    但那不是很有用 .

    您可以使用pipework在docker容器之间创建专用网络 .

  • 75

相关问题