2017-07-08 43 views
0

我在我的服务中有一个HTTP健康检查,公开在localhost:35000/health上。目前它总是返回200 OK。对健康检查的配置是通过HTTP API编程方式,而不是一种服务的配置,但在本质上,它是:Mac容器托管网络的Docker - 领事健康检查连接被拒绝

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)领事健康检查通过没有任何问题。然而,当我在泊坞窗容器中运行领事,健康检查与失败:

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 

泊坞窗容器启动领事,据我所知,在exaclty相同的状态主机版本:

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" 

我猜问题是,领事正试图对容器回送接口执行GET请求,而不是我打算的,这是主机的回送接口。这是一个正确的假设吗?更重要的是,我需要做些什么来纠正问题?

回答

0

因此,发现在macOS的某些早期版本中存在一个阻止使用docker0网络的错误。虽然该bug在较新版本中得到修复,但Docker支持扩展到较旧版本,因此Docker for Mac目前不支持docker0。详情请参阅this discussion

解决方法是为主机上的回送接口创建别名,将该服务设置为侦听该别名或0.0.0.0,并配置Consul将健康检查GET请求发送到别名。

设置别名(选择一个不是被用于其他任何的私有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。后面的选项是在讨论中提出的,但我只用别名尝试过。

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