让 docker 在 docker 中访问 consul
let docker access consul in docker compose
docker撰写文件:
version: '3'
services:
rs:
build: .
ports:
- "9090:9090"
consul:
image: "consul"
ports:
- "8500:8500"
hostname: "abc"
rs
是一个 go 微型服务器应用程序,它将访问领事和在文件中配置的领事地址,例如:
"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
服务不知道这一点,它会尝试通过查询 127.0.0.11
端口的默认 DNS 服务器来解析 abc
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_
作为前缀)。在这个网络上,Consul 机器有 alias abc
。现在你的 rs
服务应该可以通过 http://abc:8500/
到达 Consul 服务
我使用注释行(image:alpine:3.7
和 command: sleep 600
)而不是 build: .
来测试连接,因为我没有您的 rs
服务代码在 build:
中使用。容器启动后,我使用 docker exec -it <conatiner-id> sh
在 rs
容器上启动 shell,然后安装 curl
并能够通过以下命令检索 Consul UI 页面:
curl http://abc:8500/ui/
希望这对您有所帮助。
docker撰写文件:
version: '3'
services:
rs:
build: .
ports:
- "9090:9090"
consul:
image: "consul"
ports:
- "8500:8500"
hostname: "abc"
rs
是一个 go 微型服务器应用程序,它将访问领事和在文件中配置的领事地址,例如:
"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
服务不知道这一点,它会尝试通过查询 127.0.0.11
端口的默认 DNS 服务器来解析 abc
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_
作为前缀)。在这个网络上,Consul 机器有 alias abc
。现在你的 rs
服务应该可以通过 http://abc:8500/
我使用注释行(image:alpine:3.7
和 command: sleep 600
)而不是 build: .
来测试连接,因为我没有您的 rs
服务代码在 build:
中使用。容器启动后,我使用 docker exec -it <conatiner-id> sh
在 rs
容器上启动 shell,然后安装 curl
并能够通过以下命令检索 Consul UI 页面:
curl http://abc:8500/ui/
希望这对您有所帮助。