将新容器添加到现有集群(sworm)

时间:2017-01-01 21:37:14

标签: docker rabbitmq cloud cluster-computing docker-swarm

我在尝试实现将新容器添加到现有群集的最佳方法时遇到问题,而所有容器都在docker中运行。

假设我有一个docker swarm,并且每当容器由于某种原因停止/失败时,swarm会启动新容器并期望它将自己添加到群集中。

如何让任何容器能够将自己添加到群集中?

我的意思是,例如,如果我想创建一个RabbitMQ HA集群,我需要创建一个master,然后创建slave,假设RabbitMQ(master或slave)的每个实例都是一个容器,我们现在假设一个他们失败了,我们有两个选择:

1)从属容器失败。

2)主容器失败。

通常,一种能够作为集群运行的服务,它还能够选择一个新的领导者作为主人,因此,假设这一点scenerio在没有任何干预的情况下正常工作,如何将一个新容器添加到swarm(使用docker swarm)将能够将自己添加到群集中?

这里的问题是,每次都不会使用新参数创建新容器,容器总是在第一次部署时创建,这意味着,我不能只更改它的命令行参数,这是一个云,所以我不能硬编码使用IP。

这里遗漏了一些东西。 也许试图在“docker Swarm”级别声明一个“服务”,将使新容器能够将自己添加到集群中,而无需了解集群中的其他任何机器......

2 个答案:

答案 0 :(得分:1)

使用Swarm扩展容器有很多选择。它可以从简单到通过容器环境变量传递信息到服务发现等广泛的范围。

以下是一些选项:

  • 将IP作为容器环境变量传递。例如docker run -td -e HOST_IP=$(ifconfig wlan0 | awk '/t addr:/{gsub(/.*:/,"",$2);print$2}') somecontainer:latest
    • 这会将内部容器环境变量HOST_IP设置为启动它的计算机的IP。
  • Service Discovery。查询已知入口点以确定有关任何所需服务的信息,如IP,端口等。
    • 这是最常见的横向扩展选项。您可以在official Docker docs中详细了解相关信息。高级概述是您在主服务器上设置Consul之类的服务,您可以通过服务查询来查找其他相关服务的信息。示例:Web服务器需要DB。 DB会将自己添加到Consul,Web服务器将启动并查询Consul以获取数据库IP和端口。
  • Network Overlay。在swarm中创建网络,以便您的服务相互通信。
    • 示例:


$ docker network create -d overlay mynet
$ docker service create –name frontend –replicas 5 -p 80:80/tcp –network mynet mywebapp
$ docker service create –name redis –network mynet redis:latest

这允许Web应用程序通过将它们放在同一网络上与redis进行通信。

最后,在上面的示例中,最好将其部署为2个单独的容器,您可以单独扩展。例如部署一个MASTER和一个SLAVE容器。然后,您将根据所需的数量缩放每个。例如要扩展到3个从属设备,你可以docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS>启动其他从设备。在这种情况下,如果其中一个缩放的从属设备出现故障,那么swarm将启动一个新任务以将任务数量恢复为3个。

答案 1 :(得分:0)

https://docs.docker.com/engine/reference/builder/#healthcheck

Docker镜像有一个用于健康检查的新图层。 在容器中使用运行状况检查图层,例如:

RUN ./anyscript.sh HEALTHCHECK exit 1 or (Any command you want to add) HEALTHCHECK检查命令0或1的状态代码,而不是结果为 健康的 2.不健康 3.开始等。

Docker swarm自动重启swarm集群中不健康的容器。