记录docker使用kong consul postgresql配置dns异常解决

docker 部署 postgresql、kong、consul,kong 使用postgresql数据库作为数据存储,使用consul 作为服务发现

1 KONG_DNS_RESOLVER 配置问题

想要通过docker 内置的dns可以不需要配置pgsql的ip 和 consul的ip,通过dns服务发现容器名动态获取这两个容器的ip进行连接,需要解决以下两个问题:

复制代码
1  KONG_DNS_RESOLVER 只能接收ipv4的地址,无法配置dns域名进行服务发现

2 如果KONG_DNS_RESOLVER 配置了consul的dns ip,那么就无法通过dns发现pgsql的地址,出现以下问题: 
 [lua] balancer.lua:540: could not obtain list of upstreams: [postgres] [cosocket] DNS resolution failed: dns server error: 2 server failure. Tried: ["(short)kong-database:(na) - cache-miss","kong-database:33 - cache-miss/scheduled/querying/dns server error: 2 server failure","kong-database:1 - cache-miss/scheduled/querying/dns server error: 2 server failure","kong-database:5 - cache-miss/scheduled/querying/dns server error: 2 server failure"], context: ngx.timer
 并且我们的需要是只配置域名,通过dns进行动态解析ip
2 处理KONG_DNS_RESOLVER 配置

我们可以通过go编写一个可执行程序用来dns获取pgsql的ip和consul的ip配置到环境变量中,然后再进行启动,也可以使用其他方法,只要是在kong启动前将pgsql 和consul的ip配置到环境变量中即可,由于kong容器中缺少一些软件,如dig、ping等,无法直接通过命令行去获取到pgsql 、consul的ip,这里就使用go编译成可执行文件去获取

go 复制代码
package main

import (
	"fmt"
	"net"
	"os"
)

func main() {
	args := os.Args[1:]
	domain := "kong-database"

	if len(args) > 0 {
		domain = args[0]
	}

	// 解析域名获取IP地址
	ips, err := net.LookupIP(domain)
	if err != nil {
		fmt.Fprintf(os.Stderr, "解析域名失败: %v\n", err)
		os.Exit(1)
	}

	// 提取第一个IPv4地址(跳过IPv6)
	var ip string
	for _, addr := range ips {
		if addr.To4() != nil {
			ip = addr.String()
			break
		}
	}

	// 检查是否找到有效IP
	if ip == "" {
		fmt.Fprintf(os.Stderr, "未找到 %s 的IPv4地址\n", domain)
		os.Exit(1)
	}
	fmt.Printf(ip)
}

docker kong容器yml配置

yml 复制代码
version: '3.8'

networks:

  base_service_database-net:
    external: true
    driver: overlay

services:

  consul:
    image: consul:1.15.4
    restart: always
    container_name: consul
    networks:
      - base_service_database-net
    ports:
      - "8500:8500"
      - "8600:8600/udp"
    volumes:
      - /etc/localtime:/etc/localtime
      - /data/docker/consul/data:/consul/data
    environment:
      - TZ=Asia/Shanghai
    deploy:
      placement:
        constraints:
          - node.hostname == manager
          
  kong-database:
    image: postgres:16
    container_name: kong-database
    restart: always
    networks:
      - base_service_database-net
    environment:
      - POSTGRES_USER=kong
      - POSTGRES_DB=kong
      - POSTGRES_PASSWORD=kong
      - TZ=Asia/Shanghai
    volumes:
      - /data/docker/postgresql/data:/var/lib/postgis/data
      - /data/docker/postgresql/data:/var/lib/postgresql/data
    ports:
      - "5348:5432"
    deploy:
      placement:
        constraints:
          - node.hostname == manager  #

   #kong数据库的初始化
  kong-migration:
      container_name: kong-migration
      image: kong:3.9.1-ubuntu
      networks:
        - base_service_database-net
      depends_on:
        - kong-database
      restart: on-failure
      environment:
        - KONG_PG_HOST=kong-database
        - KONG_DATABASE=postgres
        - KONG_PG_USER=kong
        - KONG_PG_PASSWORD=kong
        - KONG_CASSANDRA_CONTACT_POINTS=kong-database
      deploy:
        placement:
          constraints:
            - node.hostname == manager  #
      command: sh -c "kong migrations bootstrap && kong migrations up"

  kong:
      container_name: kong
      image: kong:3.9.1-ubuntu
      restart: always
      networks:
        - base_service_database-net
      volumes:
        - /data/docker/kong/get_consul_ip:/get_consul_ip
        - /data/docker/kong/get_kongdatabase_ip:/get_kongdatabase_ip
      command: sh -c "export KONG_DNS_RESOLVER="$$(./get_consul_ip):8600,127.0.0.11:53" && export KONG_PG_HOST="$$(./get_kongdatabase_ip)" && /docker-entrypoint.sh kong docker-start"
      depends_on:
        - kong-migration
        - consul
      environment:
        - TZ=Asia/Shanghai
        - KONG_DATABASE=postgres
#        - KONG_PG_HOST=kong-database
        - KONG_PG_USER=kong
        - KONG_PG_PASSWORD=kong
        - KONG_CASSANDRA_CONTACT_POINTS=kong-database
        - KONG_PROXY_ACCESS_LOG=/dev/stdout
        - KONG_ADMIN_ACCESS_LOG=/dev/stdout
        - KONG_PROXY_ERROR_LOG=/dev/stderr
        - KONG_ADMIN_ERROR_LOG=/dev/stderr
        - KONG_ADMIN_LISTEN=0.0.0.0:8001, 0.0.0.0:8444 ssl
        - KONG_PROXY_LISTEN=0.0.0.0:8000, 0.0.0.0:8443 ssl
        - KONG_ADMIN_GUI_LISTEN=0.0.0.0:8002, 0.0.0.0:8445 ssl

      ports:
        - "8000:8000" # Proxy
        - "8443:8443" # Proxy SSL
        - "8001:8001" # Admin API
        - "8444:8444" # Admin API SSL
        - "8002:8002" # Kong Manager
        - "8445:8445" # Kong Manager SSL
      deploy:
        placement:
          constraints:
            - node.hostname == manager
相关推荐
GitCode官方25 分钟前
投稿|Git + Docker 零基础入门攻略
git·docker·容器
bukeyiwanshui1 小时前
20260509 docker项目总结
运维·docker·容器
谁在黄金彼岸1 小时前
Docker Compose删除服务后,docker compose down无法关闭的问题解决
docker·容器
数据智能老司机1 小时前
使用 Docker 构建可落地运行的 AI 系统——Docker Desktop:AI/ML 工作流的运行时基础
docker·容器
芥子沫2 小时前
Docker部署OrangeHRM(人事管理)
docker·人事管理·hr应用
坤盾科技3 小时前
Docker 离线地图服务器搭建实战:Node.js + OpenLayers + MBTiles
linux·javascript·arcgis·docker·node.js
Harvy_没救了3 小时前
【容器技术-Docker】Docker镜像
运维·docker·容器
诸葛老刘3 小时前
在PC机上 使用docker vLLM镜像部署Qwen3-1.7B
docker·vllm
请叫我徐先生3 小时前
seafile 在飞牛下 docker 部署重启设备后 seahub 异常无法启动的解决方案
docker·debian·seafile·飞牛·fnos
emiya_saber4 小时前
docker cmd
linux·运维·docker