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

Failing consul health check on local machine

我使用 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 注册服务。 但是,访问 consul UI 我可以看到该服务的状态为 failing 因为健康检查没有工作。

UI 显示此消息:

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

不确定为什么不能正常工作,但我感觉我可能错误配置了 consul。 任何帮助都会很棒。

Consul 运行 在您的 docker 容器中。当你在这个容器中使用 127.0.0.1 时,它指的是它自己,而不是你的主机。

您需要使用您的容器已知的主机 IP(当然还要确保您的服务可以访问并侦​​听此特定 IP)。

在大多数情况下,您应该能够通过默认的 docker0 网桥 ip 从容器联系您的主机,您可以使用 ip addr show dev docker0 从您的主机获得 .

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

虽然 Zeitounator 的回答非常好并且回答了您的直接问题, "indirect" 解决您问题的方法是管理 nodejs 服务 通过 docker-compose。

恕我直言,使用同一工具管理所有涉及的服务是个好主意, 因为那时他们的生命周期是一致的,而且很容易配置他们交谈 彼此(至少 docker-compose 是这样)。

另外,让容器访问宿主机上的服务存在安全风险。 在生产环境中,您通常希望从容器中屏蔽主机服务, 否则容器将失去其 "containment" 角色。

因此,在您的情况下,您需要将 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

然后你的 Consul 服务就可以访问 nodejs-service 通过 http://nodejs-service:6001/health.