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
中添加<IP address of rabbitmq container> rabbitmq
,然后重试。
https://docs.docker.com/network/network-tutorial-standalone/#use-user-defined-bridge-networks 提供有关如何将两个容器联网以便它们可以在同一网络上相互 ping 通的信息。
【讨论】:
以上是关于RabbitMQ 在不同 docker 容器中的状态的主要内容,如果未能解决你的问题,请参考以下文章