【发布时间】:2016-03-06 01:52:41
【问题描述】:
我正在构建一个 Docker 主机,我想在其中对正在运行的容器进行无停机升级。现在,假设我只运行一个容器。
我构建了一个新映像并使用docker run -P ... 从其中启动一个容器,以便为其分配随机主机端口。然后我可以使用 Registrator 之类的东西来自动更新 Consul 中的服务。现在,Consul 对镜像名称对应的服务有两个注册:旧容器和新容器。
我想更新我的 nginx 反向代理配置以使用 Consul-Template (as described here) 指向新容器的端口。 如何让 Consul-Template 只获取最新容器的详细信息?
我考虑过的两个解决方案是:
- 使用
CreateIndex查找此服务的最新注册。但是,不确定如何使 Consul-Template 按 CreateIndex 排序。 - 使用服务标签。 问题是我不确定如何从以前的容器/Consul 服务注册中删除标签。如果可能的话,那么我可以将特定标签分配给新容器和select them in Consul-Template。这将扩展到对多个容器进行无停机升级。
更新:我找到了一些关于如何更新/清除标签的文档:1、2、3。这可以在使用标签启动新容器之前运行的旧容器上完成。
这是解决这个问题的最好方法吗?
【问题讨论】:
-
您可以考虑将服务发现集成到您的应用程序操作中。要么在你的容器中运行一个领事代理,要么让你的容器在启动时注册它的服务。这使您可以在服务上指定额外的健康检查,使 consul 能够检测服务何时关闭或变得不可用。请参阅:consul.io/docs/agent/checks.html 和 consul.io/docs/guides/external.html
-
@MarkO'Connor 感谢您的指点——我是 Consul 的新手,很高兴听到这些功能。
标签: docker load-balancing service-discovery consul consul-template