Docker容器发现的领事:如何在Consul-Template中获取最新的容器?

时间:2016-03-06 01:52:42

标签: docker load-balancing service-discovery consul consul-template

我正在构建一个Docker主机,我想对正在运行的容器进行无停机升级。现在,假设我只运行一个容器。

我构建了一个新映像并使用docker run -P ...从中启动一个容器,以便为其分配随机主机端口。然后我可以使用Registrator之类的东西来自动更新Consul中的服务。现在,Consul有两个与图像名称对应的服务注册:旧容器和新容器。

我想更新我的nginx反向代理配置,使用Consul-Template (as described here)指向新容器的端口。 如何使Consul-Template仅获取最新容器的详细信息?

我考虑过的两个解决方案是:

  • 使用CreateIndex查找此服务的最新注册。但是,不知道如何通过CreateIndex进行Consul-Template排序。
  • 使用服务标签。 问题是我不确定如何从以前的容器/ Consul服务注册中删除标签。如果可行,那么我可以将特定标签分配给新容器和select them in Consul-Template。这可以扩展到对多个容器进行无停机升级。

更新:我找到了一些有关如何更新/清除代码的文档:123。这可以在使用标记启动新容器之前运行的旧容器上完成。

这是解决此问题的最佳方法吗?

1 个答案:

答案 0 :(得分:0)

我最近遇到了在 Consul Template 中获取最旧/最新实例的问题。我在网上找不到任何提示,所以我将答案留在这里。

我在 Consul 中发现的唯一允许区分实例年龄的属性是 CreateIndex。在 Consul 模板中使用它会很容易:

<button id="btn">start recording</button>

但不幸的是,服务函数返回的 HealthService 结构体并没有从 Consul 获取这个属性。我必须extend it才能使这个示例正常工作。