本地机器上的领事健康检查失败
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
.
我使用 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
.