如何在docker-compose环境中配置解析Consul的.service.consul域名
解决方案
出现该问题的核心原因是Docker默认内置DNS服务不会将.consul后缀的域名解析请求转发到你部署的Consul服务DNS端口,仅宿主机配置了对应解析规则所以本地运行正常,两种适配方案如下:
方案一:修改docker-compose配置,指定容器DNS(适配你当前KrakenD用DNS做服务发现的配置)
直接在需要解析Consul域名的服务(krakend、google-search-service如果有需要也可以加)下新增DNS配置即可,修改后的krakend服务配置如下:
krakend: image: devopsfaith/krakend container_name: krakend volumes: - ./krakend:/etc/krakend ports: - "1234:1234" - "8080:8080" - "8090:8090" networks: - micros # 新增以下配置 dns: - 127.0.0.11 # 保留Docker默认DNS,用于解析同Docker网络内的服务名 - consul # 指向同网络下的Consul服务,作为备用DNS解析.consul后缀域名 dns_opt: - "ndots:2" # 适配多段式域名的解析优先级
方案二:改用KrakenD原生Consul服务发现(更稳定,无需修改Docker网络配置)
KrakenD本身支持直接对接Consul的HTTP API做服务发现,不用走DNS解析链路,出错概率更低,修改方式如下:
- 修改KrakenD全局配置,新增Consul服务发现的全局配置:
{ "version": 2, "extra_config": { "github_com/devopsfaith/krakend-gologging": { "level": "ERROR", "prefix": "[KRAKEND]", "syslog": false, "stdout": true, "format": "default" }, // 新增Consul服务发现配置 "github_com/devopsfaith/krakend-sd-consul": { "address": "consul:8500", "scheme": "http" } }, // 其余原有全局配置保持不变 ... }
- 修改对应endpoint的backend配置,将服务发现类型改为
consul:
"backend": [ { "sd": "consul", // 从dns改为consul "url_pattern": "/external-dbs/google/{searchParam}", "host": [ "google-search-service" // 直接填Consul上注册的服务名即可 ], "disable_host_sanitize": true } ]
内容的提问来源于stack exchange,提问作者antonof
相关产品推荐
相关产品推荐

