我的docker图片是否需要自己的领事客户端实例?

我有一个docker化的应用程序拆分在几个容器(几个前端和后端服务器,负载平衡器,MySQL,elasticsearch等)。 负载平衡器的configuration需要知道哪些容器已经启动,所以我正在向Consul服务发现注册服务。

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

有什么我可以遵循的最佳做法?

你不需要在每个docker集装箱上运行一个总领事代理,你可以简单地利用领事把它的DNS暴露给你的本地。 以下是不是从一个容器,但你会得到这个想法反正我在做什么。

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

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

注意:我为consul-master添加了一个/ etc / hosts条目,并在/etc/resolv.conf文件中添加了127.0.0.1的名称服务器。

目录/etc/consul.d/保存我的服务configuration文件。 以下是一个例子:

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

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

 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 XXXX ;; 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 

希望对此有所帮助,并给予清晰的认识

我不确定是否有最佳做法,但是我发现这篇博文是非常有用的自动泊坞窗服务公告 。 他谈到了几种服务注册方法及其好处和缺点。

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

一种select是,在每个主机上运行一个总领事代理。 然后你可以使用注册器之类的东西来监视新容器的启动和closures,并自动更新Consul。 主要优点是你的容器有一个工作要做,运行你的应用程序。 注册人也有一个工作要做,注意容器启动/停止事件,并logging在领事。 你的集装箱对领事一无所知,仍然参与服务发现。

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