首页 > 解决方案 > 让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?

标签: dockerconsulgo-micro

解决方案


您更改了 consul 容器的主机名,但rs服务不知道这一点,它尝试abc通过查询默认 DNS 服务器127.0.0.11port来解决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.7and command: sleep 600) 而不是build: ., 来测试连接,因为我没有您的rs服务代码可用于build:. 一旦容器启动,我曾经docker exec -it <conatiner-id> sh在容器上启动 shell rs,然后安装curl并能够通过以下命令检索 Consul UI 页面:

curl http://abc:8500/ui/

希望这可以帮助。


推荐阅读