让 docker 在 docker 中访问 c​​onsul

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 在主机中访问 c​​onsul 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.7command: sleep 600)而不是 build: . 来测试连接,因为我没有您的 rs 服务代码在 build: 中使用。容器启动后,我使用 docker exec -it <conatiner-id> shrs 容器上启动 shell,然后安装 curl 并能够通过以下命令检索 Consul UI 页面:

curl http://abc:8500/ui/

希望这对您有所帮助。