【问题标题】:Connect RabbitMQ container from another container从另一个容器连接 RabbitMQ 容器
【发布时间】:2017-02-14 17:11:11
【问题描述】:

我通过运行以下命令创建了 rabbitmq 容器

docker run -d --hostname My-rabbit --name test-rabbit -p 15672:15672 rabbitmq:3-management

创建了一个名为 userrabbit 的用户,并赋予如下权限

rabbitmqctl add_user userrabbit password
rabbitmqctl set_user_tags userrabbit administrator
rabbitmqctl set_permissions -p / userrabbit ".*" ".*" ".*"

这个(test-rabbit)的IP是172.17.0.3

我又创建了一个容器(172.17.0.4),我的应用程序在其中运行,我需要在其中提供rabbitmq的url,我提供了如下url

transport_url = rabbit://userrabbit:password@172.17.0.3:15672/

在容器(172.17.0.4)的日志中显示为

AMQP server 172.17.0.3:15672 closed the connection. Check login credentials: Socket closed

但我可以使用如下所示的相同凭据从容器 (172.17.0.4) ping RabbitMq

curl -i -u userrabbit:password http://172.17.0.3:15672/api/whoami
HTTP/1.1 200 OK
vary: Accept-Encoding, origin
Server: MochiWeb/1.1 WebMachine/1.10.0 (never breaks eye contact)
Date: Tue, 14 Feb 2017 17:06:39 GMT
Content-Type: application/json
Content-Length: 45
Cache-Control: no-cache

{"name":"userrabbit","tags":"administrator"}

【问题讨论】:

    标签: docker rabbitmq containers


    【解决方案1】:

    两件事...

    第一件事:

    transport_url 的端口是 5672

    您列出的 15672 端口是 Web 管理控制台

    第二件事:

    您需要通过 docker 网络将容器联网在一起。

    最简单的方法是使用--link 选项,在run 时间提供给第二个容器。

    docker run --link test-rabbit:test-rabbit (... other options here)

    通过添加--link test-rabbit:test-rabbit 选项,您的应用程序将能够将test-rabbit 视为具有IP 地址的有效网络名称。

    更新您的传输网址

    通过这两个修复,您的 transport_url 就变成了这个

    transport_url = rabbit://userrabbit:password@test-rabbit:5672/

    其他网络选项

    使用--link 是最简单的开始方式,但扩展性不强。

    docker-compose 使得在容器之间添加链接变得非常容易

    您还可以通过命令行工具和 docker-compose 创建自定义 docker 网络,将容器连接在一起。这需要更多的工作,但从长远来看会更好。

    【讨论】:

      【解决方案2】:

      您需要使用--hostname 选项为每个docker 容器指定主机名,并为所有其他容器添加/etc/host 条目,您可以使用--add-host 选项或手动编辑/etc/hosts 文件来完成。

      首先创建一个网络,以便您可以分配 IP:docker network create --subnet=172.18.0.0/16 mynet1 然后运行容器:

      docker run -d --net mynet1 --ip 172.18.0.11 --hostname rab1 --add-host rab2:172.18.0.12 --name rab1con -p 15672:15672 rabbitmq:3-management
      

      第二个

      docker run -d --net mynet1 --ip 172.18.0.12 --hostname rab2 --add-host rab1:172.18.0.11 --name rab2con -p 15673:15672 rabbitmq:3-management
      

      【讨论】:

      • 我尝试了以下命令它启动了容器,但它们没有加入集群
      【解决方案3】:

      创建一个 docker 网络,以便 rabbitmq 客户端可以连接到 rabbitmq 服务器,两者都作为 docker 容器运行。 例

      docker 网络创建 sdk-net

      然后使用该网络运行 rabbitmq docker 并为其命名

      docker run -d --rm --name demo-rabbit --net sdk-net -p 5672:5672 -p 15672:15672 rabbitmq:3.6.15-management-alpine

      像运行你的客户端一样(注意运行命令 sdk-net 中的网络名称

      docker run --rm -p 8090:8090 --net sdk-net pythontest

      在您的客户端中,可以访问 Docker 容器的名称。所以AMQ连接字符串会变成这样

      amqp_url ='amqp://demo-rabbit:5672/'

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-01-26
        • 2017-10-15
        • 1970-01-01
        • 2021-04-08
        • 2019-02-24
        相关资源
        最近更新 更多