本地计算机上的领事健康检查失败

时间:2019-06-01 15:10:09

标签: docker consul service-discovery

我使用docker-compose通过docker运行Consul

version: '3'

services:  
  consul:
    image: unifio/consul:latest
    ports:
      - "8500:8500"
      - "8300:8300"
    volumes: 
      - ./config:/config
      - ./.data/consul:/data
    command: agent -server -data-dir=/data -ui -bind 0.0.0.0 -client 0.0.0.0 -bootstrap-expect=1
  mongo:
    image: mongo
    ports:
      - "27017:27017"
      - "27018:27018"
    volumes:
      - ./.data/mongodb:/data/db
    command: mongod --bind_ip_all

,并在端口6001上运行一个nodejs服务,该服务公开了/health端点以进行运行状况检查。 我可以通过此consul package注册该服务。 但是,访问领事UI可以看到该服务的状态为failing,因为运行状况检查不起作用。

用户界面显示以下消息:

Get http://127.0.0.1:6001/health: dial tcp 127.0.0.1:6001: getsockopt: connection refused

不确定为什么不能完全正常工作,但是我有点感觉我的领事配置不正确。 任何帮助都会很棒。

2 个答案:

答案 0 :(得分:2)

Consul在您的Docker容器中运行。在此容器中使用127.0.0.1时,它是指自身,而不是主机。

您需要使用容器已知的主机IP(当然,请确保您的服务可访问并且正在侦听此特定IP)。

在大多数情况下,您应该能够通过默认的docker0网桥IP从容器中与您的主机联系,您可以使用ip addr show dev docker0从主机上获取in this other answer的概述。< / p>

最好的IMO解决方案是发现容器使用的网关,该网关将指向主机上的特定网桥IP(即在启动docker-compose项目时为它创建的网桥)。有several methods you can use可以从容器中发现此IP,具体取决于安装的工具和您的Linux风格。

答案 1 :(得分:1)

虽然Zeitounator的回答很好,可以回答您的直接问题, 解决您问题的“间接”方法是管理nodejs服务 通过docker-compose。

恕我直言,最好使用同一工具来管理所有涉及的服务, 这样就可以调整他们的生命周期,并且很容易配置它们进行通话 彼此之间(至少docker-compose就是这种情况)。

此外,就安全性而言,让容器访问主机上的服务存在风险。 在生产环境中,您通常希望将主机服务与容器隔离开来, 否则,容器将失去其“围堵”作用。

因此,在您的情况下,您需要将nodejs服务添加到docker-compose.yml

services:
  (...)
  nodejs-service:
    image: nodejs-service-image
    ports:
    - "6001:6001" [this is only required if you need to expose the port on the host]
    command: nodejs service.js

然后您的领事服务将能够访问nodejs-service 通过http://nodejs-service:6001/health