我使用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
不确定为什么不能完全正常工作,但是我有点感觉我的领事配置不正确。 任何帮助都会很棒。
答案 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
。