用于Mac容器的Docker托pipenetworking – Consul运行状况检查连接被拒绝

我在我的服务中有一个HTTP健康检查,显示在localhost:35000/health 。 目前它总是返回200 OK 。 运行状况检查的configuration是通过HTTP API而不是通过服务configuration来编程的,但本质上是:

 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 )运行领事时,健康检查通过没有任何问题。 但是,当我在docker集装箱运行领事时,运行状况检查失败:

 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集装箱启用了与领主版本相同的状态:

 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请求,而不是我的意图,这是主机的回环接口。 这是一个正确的假设吗? 更重要的是,我需要做些什么来纠正这个问题呢?

所以它发现在以前版本的macOS中有一个错误,阻止了docker0networking的使用。 虽然该bug在较新的版本中得到修复,但是Docker支持扩展到较旧的版本,因此Docker for Mac目前不支持docker0 。 详细信息请参阅此讨论 。

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

要设置别名(select一个没有用于其他任何东西的私有IP地址;我select了一个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上进行监听。 后面的选项是在讨论中提出的,但我只用别名尝试过。

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