我在尝试实现将新容器添加到现有群集的最佳方法时遇到问题,而所有容器都在docker中运行。
假设我有一个docker swarm,并且每当容器由于某种原因停止/失败时,swarm会启动新容器并期望它将自己添加到群集中。
如何让任何容器能够将自己添加到群集中?
我的意思是,例如,如果我想创建一个RabbitMQ HA集群,我需要创建一个master,然后创建slave,假设RabbitMQ(master或slave)的每个实例都是一个容器,我们现在假设一个他们失败了,我们有两个选择:
1)从属容器失败。
2)主容器失败。
通常,一种能够作为集群运行的服务,它还能够选择一个新的领导者作为主人,因此,假设这一点scenerio在没有任何干预的情况下正常工作,如何将一个新容器添加到swarm(使用docker swarm)将能够将自己添加到群集中?
这里的问题是,每次都不会使用新参数创建新容器,容器总是在第一次部署时创建,这意味着,我不能只更改它的命令行参数,这是一个云,所以我不能硬编码使用IP。
这里遗漏了一些东西。 也许试图在“docker Swarm”级别声明一个“服务”,将使新容器能够将自己添加到集群中,而无需了解集群中的其他任何机器......
答案 0 :(得分:1)
使用Swarm扩展容器有很多选择。它可以从简单到通过容器环境变量传递信息到服务发现等广泛的范围。
以下是一些选项:
docker run -td -e HOST_IP=$(ifconfig wlan0 | awk '/t addr:/{gsub(/.*:/,"",$2);print$2}') somecontainer:latest
HOST_IP
设置为启动它的计算机的IP。
$ 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集群中不健康的容器。