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

我遇到了一个问题,试图实现在Docker中运行所有容器时将新容器添加到现有集群的最佳方法。

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

我怎样才能让任何容器能够将自己添加到群集?

我的意思是,例如,如果我想创build一个RabbitMQ HA群集,我需要创build一个master,然后创buildslave,假设RabbitMQ(master或slave)的每个实例都是一个容器,现在让我们假设其中一个失败,我们有2个选项:

1)从属容器失败。

2)主容器失败。

通常情况下,一个有能力作为一个集群运行的服务,它也有能力选举一个新的领导者作为主,所以,假设这个scenerio在没有任何干预的情况下工作,如何将一个新的容器添加到群(使用docker群)将能够将自己添加到群集?

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

这里有东西丢失。 也许试图在“docker Swarm”级别中声明一个“Service”,将使新的容器能够将自己添加到集群,而不需要知道集群中的其他机器。

使用Swarm扩展容器的选项有很多。 它的范围可以很简单,就像通过容器环境variables传递信息到服务发现一样广泛。

这里有几个选项:

  • 通过IP作为容器环境variables。 例如docker run -td -e HOST_IP=$(ifconfig wlan0 | awk '/t addr:/{gsub(/.*:/,"",$2);print$2}') somecontainer:latest
    • 这将设置内部容器环境variablesHOST_IP到它启动的机器的IP地址。
  • 服务发现 。 查询已知的入口点,以确定所需的服务信息,如IP,端口等。
    • 这是最常见的扩展选项。 您可以在官方Docker文档中阅读更多关于它的信息。 高层次的概述是,你在主服务器上build立一个像Consul这样的服务,你有服务查询来查找其他相关服务的信息。 示例:Web服务器需要DB。 DB将自己添加到Consul,Web服务器将启动并查询Consul的数据库IP和端口。
  • networking覆盖 。 在群中创build一个networking,以便您的服务彼此进行通信。
    • 例:

 $ 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 

这允许networking应用程序通过将它们放置在同一networking上来与redis进行通信。

最后,在上面的示例中,最好将其部署为2个单独的容器。 例如,部署一个MASTER和一个SLAVE容器。 然后,你会缩放每个依赖你所需要的数字。 例如,要扩展到3个从站,您将运行docker service scale <SERVICE-ID>=<NUMBER-OF-TASKS> ,这将启动附加从站。 在这种情况下,如果一个缩放的从站失败swarm将启动一个新的任务数量回到3。

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的状态代码,结果为1.健康2.不健康3.启动等

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