如何解析 docker-compose 中的 Consul 域

问题描述 投票:0回答:3

我正在与一组使用 Java + Spring Boot 开发的微服务合作,并希望在 Docker 组合中使用 Consul 和 KrakenD。

我的 docker-compose 文件如下所示:

version: '3.8'

services:

  # Consul
  # Service discovery similar to Eureka but could keep configuration
  consul:
    image: consul
    container_name: consul
    command: agent -server -ui -node=server1 -bootstrap-expect=1 -client=0.0.0.0
    environment:
      - CONSUL_BIND_INTERFACE=eth0
    ports:
      - "8500:8500"
      - "8600:8600/udp"
      - "8600:8600/tcp"
    hostname: "consul"
    networks:
      - micros

  krakend:
    image: devopsfaith/krakend
    container_name: krakend
    volumes:
      - ./krakend:/etc/krakend
    ports:
      - "1234:1234"
      - "8080:8080"
      - "8090:8090"
    networks:
      - micros

  google-search-service:
    environment:
      - JAVA_OPTIONS=-Dlogging.level.net.leyba.googlesearch=INFO
    image: google-search-service
    container_name: google-search-service
    #ports:
    #  - "7000-7200"
    networks:
      - micros
    depends_on:
      consul:
        condition: service_started
#      krakend:
#        condition: service_started

networks:
  micros:

KrakenD 配置文件如下所示:

{
  "version": 2,
  "extra_config": {
    "github_com/devopsfaith/krakend-gologging": {
      "level": "ERROR",
      "prefix": "[KRAKEND]",
      "syslog": false,
      "stdout": true,
      "format": "default"
    }
  },
  "timeout": "3000ms",
  "cache_ttl": "300s",
  "output_encoding": "json",
  "name": "googlesearch",
  "port": 8080,
  "endpoints": [
    {
      "endpoint": "/v1/googlesearch/{searchParam}",
      "method": "GET",
      "output_encoding": "json",
      "extra_config": {},
      "backend": [
        {
          "sd": "dns",
          "url_pattern": "/external-dbs/google/{searchParam}",
          "host": [
            "google-search-service.service.consul"
          ],
          "disable_host_sanitize": true
        }
      ]
    },
  ]
}

如果没有 docker,主机 google-search-service.service.consul 会通过我的 macOS 中的解析器进行解析,但似乎无法在 docker-compose 网络内解析,因此 Krakend 无法重定向 API 调用到微服务,因为找不到 Consul。

我想知道是否有办法在 docker-compose 内配置解析器或允许 KrakendD 以任何其他方式找到 Consul。

提前致谢 J

docker docker-compose microservices consul krakend
3个回答
1
投票

如果您的Consul监听8600端口并且您不想更改它,那么您可以按照官方文档此评论

/etc/systemd/resolved.conf.d/consul.conf

[Resolve]
DNS=127.0.0.1:8600
DNSSEC=false
Domains=~consul

/etc/systemd/resolved.conf.d/docker.conf

[Resolve]
DNSStubListener=yes
DNSStubListenerExtra=172.17.42.1

/etc/docker/daemon.json

{
  "bip": "172.17.42.1/16",
  "dns": ["172.17.42.1"]
}

此方法的详细描述如下: https://felix.ehrenpfort.de/notes/2022-06-22-use-consul-dns-interface-inside-docker-container/

这是如何运作的:

consul.conf
指示systemd-resolv将
*.consul
域名查找转发给Consul,Consul监听127.0.0.1:8600。

docker.conf
指示 systemd-resolv 另外监听 172.17.42.1:53 DNS 查询

daemon.json
指示 docker 将
nameservers 172.17.42.1
行添加到
/etc/resolv.conf


0
投票

docker compose 中的 extra-hosts 可以解决您的问题,您可以让 docker 将某些主机名解析为所需的 IP 地址。

检查此线程以获取更多信息:使用 --add-host 或 extra_hosts 与 docker-compose


0
投票

您可以将 Consul 配置为在端口 53 而不是 8600 上侦听 DNS,然后将其他容器配置为使用 Consul 进行 DNS 解析。

---
version: "3.8"
networks:
  micros:
    driver: bridge
    ipam:
      config:
        - subnet: 10.70.90.0/24
services:
  consul:
    image: consul:1.11.1
    container_name: consul
    environment:
      CONSUL_BIND_INTERFACE: eth0
      CONSUL_LOCAL_CONFIG: |
        {
          "client_addr": "0.0.0.0",
          "node": "server1",
          "ports": {
            "dns": 53
          },
          "recursors": [
            "8.8.8.8",
            "8.8.4.4"
          ],
          "server": true,
          "bootstrap_expect": 1,
          "ui_config": {
            "enabled": true
          }
        }
    hostname: consul
    networks:
      micros:
        ipv4_address: 10.70.90.5
    ports:
      - 8500:8500
      - 8600:53/tcp
      - 8600:53/udp

  krakend:
    image: devopsfaith/krakend
    container_name: krakend
    volumes:
      - ./krakend:/etc/krakend
    ports:
      - "1234:1234"
      - "8080:8080"
      - "8090:8090"
    dns: 10.70.90.5
    networks:
      - micros

  google-search-service:
    environment:
      - JAVA_OPTIONS=-Dlogging.level.net.leyba.googlesearch=INFO
    image: google-search-service
    container_name: google-search-service
    #ports:
    #  - "7000-7200"
    dns: 10.70.90.5
    networks:
      - micros
    depends_on:
      consul:
        condition: service_started
#      krakend:
#        condition: service_started
© www.soinside.com 2019 - 2024. All rights reserved.