我的docker镜像是否需要自己的consul客户端实例?

时间:2016-10-19 12:03:06

标签: docker consul service-discovery

我有一个dockerized应用程序分成几个容器(一些前端和后端服务器,负载均衡器,mysql,elasticsearch等)。负载均衡器的配置需要知道哪些容器已经启动,因此我正在使用Consul服务发现注册服务。

但是我不太确定在每个docker容器上运行consul代理是否是个好主意,而不是使用docker主机来监督所有正在运行的docker容器并通过Consul的HTTP-API注册它们。

我可以遵循最佳做法吗?

2 个答案:

答案 0 :(得分:3)

您不需要在每个docker容器上运行consul代理,您可以通过将其DNS暴露给您的本地来利用领事。以下不是来自容器,但无论如何你都会得到关于我在做什么的想法。

以下是我用来运行代理的命令

consul agent -data-dir /var/lib/consul/ -config-dir /etc/consul.d/ -bind 10.X.X.X -dns-port 53 -join consul-master

注意:我已经为consul-master添加了/ etc / hosts条目及其IP,我还在/etc/resolv.conf文件中添加了127.0.0.1的名称服务器。

目录/etc/consul.d/包含我的服务配置文件。以下是一个例子:

{
  "service": {
    "name": "stackoverflow",
    "tags": [
      "example"
    ],
    "port": 5000
  }
}

现在,一旦我的consul代理运行,我可以通过dig命令或http api请求检查具有服务代理(服务器/客户端)的任何主机,如下所示:

curl http://stackoverflow.service.consul:80/api/v1/ping
{"success":true,"message":"pong"}

对于DNS:

dig @127.0.0.1 -p 53 stackoverflow.service.consul

; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.62.rc1.55.amzn1 <<>> @127.0.0.1 -p 53 tracker.service.consul
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57167
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;tracker.service.consul.        IN  A

;; ANSWER SECTION:
tracker.service.consul. 0   IN  A   X.X.X.X

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Jul  7 11:29:01 2017
;; MSG SIZE  rcvd: 56

希望有助于并清楚地了解它

答案 1 :(得分:1)

我不确定是否有最佳做法,但我发现此博文非常有帮助Automatic Docker Service Announcement with Registrator。他谈到了几种服务注册方法及其好处和缺点。

更直接地回答你的问题,不,你不应该在每个容器内运行一个领事代理。

一种选择是在每个主机上运行一个consul代理。然后,您可以使用类似Registrator的内容来监视启动和关闭的新容器,并自动更新Consul。主要优点是您的容器有一项工作要做,运行您的应用程序。 Registrator还有一项工作要做,观察容器启动/停止事件并将其记录在Consul中。您的容器对领事一无所知,仍然可以参与服务发现。

还有Autopilot pattern建议朝另一个方向前进并使您的应用程序Consul知道,以便它可以报告自己的运行状况并发现自己的依赖关系。我在这个模式中看到的大部分信息都来自Joyent(就像这个blog post)。对于在应用程序中实现可伸缩性和弹性的不同观点,值得一读。