docker - 让docker在docker compose中访问consul
问题描述
码头工人撰写文件:
version: '3'
services:
rs:
build: .
ports:
- "9090:9090"
consul:
image: "consul"
ports:
- "8500:8500"
hostname: "abc"
rs
是一个 go 微型服务器应用程序,它将访问 consul 和配置在文件中的 consul 地址,例如:
"microservice": {
"serviceName": "hello",
"registry": "consul=abc:8500",
但是这不起作用,rs
报告错误日志:
register error: Put http://abc:8500/v1/agent/service/register: dial tcp: lookup abc on 127.0.0.11:53: no such host
我可以通过http://127.0.0.1:8500访问主机中的 consul ui ,它工作正常。
如何配置网络让rs可以访问consul?
解决方案
您更改了 consul 容器的主机名,但rs
服务不知道这一点,它尝试abc
通过查询默认 DNS 服务器127.0.0.11
port来解决53
。您可以在错误消息中看到这一点,因为该 DNS 服务器无法解析abc
,因为它没有关于它的信息。
在 docker-compose 中的服务之间创建的网络上,解决这个问题并让它在 docker-compose 中工作的最简单方法如下:
version: '3'
services:
rs:
build: .
# image: aline:3.7
ports:
- "9090:9090"
# command: sleep 600
networks:
rs-consul:
consul:
image: "consul"
ports:
- "8500:8500"
hostname: "abc"
networks:
rs-consul:
aliases:
- abc
networks:
rs-consul:
这将创建新的网络rs-consul
(检查docker network ls
,它将有一些前缀,我的working_directory_name_
作为前缀)。在这个网络上,领事机器有别名 abc
。现在您的rs
服务应该能够通过http://abc:8500/
我使用注释行 ( image:alpine:3.7
and command: sleep 600
) 而不是build: .
, 来测试连接,因为我没有您的rs
服务代码可用于build:
. 一旦容器启动,我曾经docker exec -it <conatiner-id> sh
在容器上启动 shell rs
,然后安装curl
并能够通过以下命令检索 Consul UI 页面:
curl http://abc:8500/ui/
希望这可以帮助。
推荐阅读
- php - 将 Stripe 结帐会话与订阅 webhook 关联
- c++ - 我怎样才能在循环中做减法?
- ibm-mq - 可以在两个远程 qmgrs 中使用具有相同 CN 的证书吗?
- vue.js - 图例未显示使用 Echarts 的 vue.js 项目
- javascript - 使用 ShellExecute 正确识别打开的 Web 浏览器以使用 document.getElement
- archunit - 确保从另一个方法调用?
- sql-server - SQL Server 2019 忽略 WHERE 子句?
- acumatica - 可以为 AP 账单分配不同的审批人
- laravel - 使用 Laravel Controller 加载索引时获取当天的记录
- python - 将所有可能的组合应用到代码中以计算分数