用于Mac容器到主机网络的Docker - Consul Health检查连接被拒绝

时间:2017-07-08 09:51:21

标签: docker microservices consul health-monitoring

我的服务中有一个HTTP运行状况检查,在localhost:35000/health上公开。目前它始终返回200 OK。运行状况检查的配置是通过HTTP API而不是服务配置以编程方式完成的,但实际上它是:

set id: service-id
set name: health check
set notes: consul does a GET to '/health' every 30 seconds
set http: http://127.0.0.1:35000/health
set interval: 30s

当我在主机上以开发模式(consul agent -dev -ui)直接运行consul时,运行状况检查没有任何问题。但是,当我在docker容器中运行consul时,运行状况检查失败并显示:

2017/07/08 09:33:28 [WARN] agent: http request failed 'http://127.0.0.1:35000/health': Get http://127.0.0.1:35000/health: dial tcp 127.0.0.1:35000: getsockopt: connection refused

据我所知,docker容器启动consul,与主机版本的状态相同:

version: '2'
services:
  consul-dev:
    image: "consul:latest"
    container_name: "net-sci_discovery-service_consul-dev"
    hostname: "consul-dev"
    ports:
      - "8400:8400"
      - "8500:8500"
      - "8600:8600"
    volumes:
      - ./etc/consul.d:/etc/consul.d
    command: "agent -dev -ui -client=0.0.0.0 -config-dir=/etc/consul.d"

我猜测问题是,consul正在尝试对容器环回接口执行GET请求,而不是我想要的,这是针对主机的环回接口。这是正确的假设吗?更重要的是,我需要做些什么来纠正这个问题?

1 个答案:

答案 0 :(得分:0)

因此,发现某些先前版本的macOS中存在一个错误,导致无法使用docker0网络。虽然在较新版本中修复了该错误,但Docker支持扩展到旧版本,因此Docker for Mac目前不支持docker0。有关详细信息,请参阅this discussion

解决方法是为主机上的loopback接口创建别名,将服务设置为侦听别名或0.0.0.0,并配置Consul以将运行状况检查GET请求发送到别名。 / p>

设置别名(选择一个未用于其他任何内容的私有IP地址;我选择了一个A类地址但不相关):

sudo ifconfig lo0 alias 10.200.10.1/24

删除别名:

sudo ifconfig lo0 -alias 10.200.10.1

从上面的服务定义中,HTTP行现在应该是:

set http: http://10.200.10.1:35000/health

侦听运行状况检查请求的HTTP服务器也需要在10.200.10.20.0.0.0上进行侦听。讨论中提出了后一种选择,但我只尝试使用别名。

我已更新问题的标题以更准确地反映问题,现在我知道了解决方案。希望它也可以帮助其他人。