Docker Redis Sentinel ip地址问题与docker堆栈部署

我正在尝试使用Docker(17.06.1-ce-win)设置一个基于哨兵的Redis集群,并且在使用IP地址时遇到了一个问题

docker stack deploy

这是我docker-compose.yml (基于这个存储库 )

 version: "3.2" services: redismaster: image: redis:3 ports: - 6381:6379 redisslave: image: redis:3 command: redis-server --slaveof redismaster 6379 ports: - 6382:6379 depends_on: - redismaster sentinel1: image: 127.0.0.1:5000/sentineldemo build: sentinel depends_on: - redismaster - redisslave ports: - 26379:26379 sentinel2: image: 127.0.0.1:5000/sentineldemo depends_on: - redismaster - redisslave ports: - 26380:26379 sentinel3: image: 127.0.0.1:5000/sentineldemo depends_on: - redismaster - redisslave ports: - 26381:26379 

在调用docker stack deploy docker-compose.yml stackdemo ,我最终得到了包含5个容器的预期覆盖networking(1个主站,1个从站,3个哨兵)。检查networking时,我看到每个容器的IP地址为表单10.0.0.x,其中x是一个奇数。

说主人有IP 10.0.0.3。

问题从这一点开始(尽pipe一切看起来都是一成不变的):

  • 当我从奴隶获得的信息,我看到奴隶看到ip 10.0.0.2为主(而不是在networking检查10.0.0.3)
  • 当我从一个容器nslookup redismaster,我得到10.0.0.2结果
  • 那么,如果我通过使主机睡眠10秒来触发故障切换: redis-cli -p 6381 DEBUG SLEEP 10 ,从机被提升为主机,正如所料。 但是我看到这个新主人有两个奴隶 ,ips是10.0.0.3和10.0.0.2
  • 那么,如果我在这个升级的主redis-cli -p 6382 DEBUG SLEEP 10上再次触发故障转移: redis-cli -p 6382 DEBUG SLEEP 10初始主节点作为master(ip 10.0.0.2)和slave(ip 10.0.0.3)出现在sentinels上,

这似乎会导致不稳定的行为,在一段时间内,我可以写在主人和奴隶上。

我对Docker非常陌生。 据我所知,在redismasterredismaster指定的redismasterparsing为服务的虚拟IP,而在master和slave的redis自动发现过程中parsing的ip是容器(10.0.0.3)

我的问题:

  • 这是预期的行为? 我在linux上遇到了与docker相同的行为
  • 我对这个问题的理解是否正确?
  • 我错过了一些明显的东西,我怎么能绕过这个问题呢?

请注意,使用docker-compose up -d时,我没有遇到任何问题