我有三个在 Swarm 模式服务中运行 RabbitMQ 的复制容器。每个容器充当一个 RabbitMQ 节点来创建一个 RabbitMQ 集群。为此,docker service create
如下:
docker service create -e RABBITMQ_ERLANG_COOKIE='mysecretcookie' --replicas 4 --network rnet -p 15672:15672 -p 5672:5672 rabbitmq
此后,我能够rabbitmqctl <hostname> join_cluster
在每个从属节点上成功创建一个 RabbitMQ 集群。
我的问题是,如果一个 swarm 节点出现故障,Docker 在另一个节点上启动一个新容器,但是该容器具有不同的随机主机名。
由于 RabbitMQ 使用主机名来识别 RabbitMQ 集群节点,因此它无法识别新容器上的新主机名,因此它假定原始节点无限期关闭。
我尝试使用 Docker 1.13 中的新模板功能,它允许您通过--hostname="{{.Node.ID}}-{{.Service.Name}}"
在docker service create
. 但是,您目前无法根据此自定义主机名发现容器,因此无法以这种方式创建 RabbitMQ 集群。
我希望能够在 Docker 开始运行新容器后让 RabbitMQ 自动重新加入集群节点。这可能吗?