RabbitMQ 在不同 docker 容器中的状态

Posted

技术标签:

【中文标题】RabbitMQ 在不同 docker 容器中的状态【英文标题】:Status of RabbitMQ in different docker container 【发布时间】:2018-07-20 00:49:04 【问题描述】:

出于测试目的,我正在使用 RabbitMQ 启动一个 docker 容器。我想启动第二个容器,它运行一个简短的命令并检查 Rabbitmq 是否实际运行。第二个容器应该阻止我的构建管道,直到它确定 RabbitMQ 已在第一个容器中成功启动。

我如何指定 rabbitmqctl 使用哪个主机名来获取 RabbitMq 的状态?我通过 docker 将两个容器链接在一起,所以端口问题应该不是问题。

例子:

rabbitmqctl -n rabbitmq status # does not work, prints diagnostic info

节点rabbitmq@rabbitmq的状态... 错误:无法在节点“rabbitmq@rabbitmq”上执行操作。请参阅下面的诊断信息和建议。

最常见的原因是:

目标节点无法访问(例如,由于主机名解析、TCP 连接或防火墙问题) CLI 工具无法通过服务器进行身份验证(例如,由于 CLI 工具的 Erlang cookie 与服务器的不匹配) 目标节点未运行

除了以下诊断信息:

请参阅 http://rabbitmq.com/documentation.html 上的 CLI、集群和网络指南以了解更多信息 在节点rabbitmq@rabbitmq上查询服务器日志

诊断

尝试联系:[rabbitmq@rabbitmq]

rabbitmq@rabbitmq: * 连接到 rabbitmq 上的 epmd(端口 4369) * epmd 报告:节点“rabbitmq”根本没有运行 rabbitmq 上的其他节点:[rabbit] * 建议:启动节点

当前节点详情: * 节点名称:rabbitmqcli52@e3ea1e73df02 * 有效用户的主目录:/var/lib/rabbitmq * Erlang cookie 哈希:AB9AFN3zvcyAWBl6ZVVOJw==

【问题讨论】:

它打印什么诊断信息?你试过rabbit@rabbitmq吗? rabbitmq 是你的容器名和镜像名吗? @vmonteco 我更新了我的问题。 你试过docker exec -ti rabbitmq rabbitmqctl status吗?如果没有,请尝试发布输出。 @vmonteco 是的,这行得通。 【参考方案1】:

您的第二个容器需要注意第一个容器:

docker run --link rabbitmq ...

现在可以从容器内部访问主机:

$ grep rabbitmq /etc/hosts
172.17.0.2  rabbitmq 01ad3098b423

$ ping rabbitmq
PING rabbitmq (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: seq=0 ttl=64 time=0.073 ms

请记住,容器链接是deprecated,而不是custom networks。

【讨论】:

【参考方案2】:

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

我将假设您使用 rabbitmq 管理容器,并且我将其称为(主机名)rab1。我会将名称 ubuntu1 命名为您要从中访问 rab1 的另一个容器。所以首先启动 rab1 并将 ubuntu1 添加到主机文件:

docker run -d --net mynet1 --ip 172.18.0.11 --hostname rab1 --add-host ubuntu1:172.18.0.12 --name rab1con -e RABBITMQ_ERLANG_COOKIE='secret cookie here' rabbitmq:3-management

然后用主机名ubuntu1启动ubuntu1con

docker run -d --net mynet1 --ip 172.18.0.12 --hostname ubuntu1 --add-host rab1:172.18.0.11 --name ubuntu1con ubuntu

现在,当您进入 ubuntu1con 时,您可以通过名称或 IP 地址访问 rab1

【讨论】:

【参考方案3】:

假设两个容器正确链接/联网,可以相互ping通,并且Rabbitmq客户端rabbitmqctl安装在第二个容器中,以下应该可以工作:

docker exec -it <second container's name or ID> rabbitmqctl -n rabbit@rabbitmq status 

在启动rabbitmq 容器时将--hostname rabbitmq 传递给docker run,并确保rabbitmq 容器内的hostname -s 打印rabbitmq

如果仍然出现错误,请在第二个容器的/etc/hosts 中添加&lt;IP address of rabbitmq container&gt; rabbitmq,然后重试。

https://docs.docker.com/network/network-tutorial-standalone/#use-user-defined-bridge-networks 提供有关如何将两个容器联网以便它们可以在同一网络上相互 ping 通的信息。

【讨论】:

以上是关于RabbitMQ 在不同 docker 容器中的状态的主要内容,如果未能解决你的问题,请参考以下文章

使用 docker-compose 连接到 RabbitMQ 容器

在Linux系统中运行并简单的测试RabbitMq容器

如何在Docker容器中安装RabbitMQ

如何在Docker容器中安装RabbitMQ

如何在Docker容器中安装RabbitMQ

rabbitmq容器启动成功,docker ps 找不到rabbitmq