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

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

有什么可以遵循的最佳实践吗?

最佳答案

您无需在每个Docker容器上运行领事代理,只需通过将领事的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
  }
}

现在,一旦我的领事代理运行,我就可以通过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

希望能有所帮助并给出清晰的想法

10-08 08:08