docker下部署kong+consul+konga 报错问题处理

前言:

由于在docker下部署一些项目比较特殊,特别是网络这一块,如果没有搞清楚,是很容易出问题的。

先上docker-compose 编排

这里的docker-compose for kong可以在 kong-compose 获取代码

version: '3.9'

x-kong-config:
  &kong-env
  KONG_DATABASE: ${KONG_DATABASE:-off}
  KONG_PG_DATABASE: ${KONG_PG_DATABASE:-kong}
  KONG_PG_HOST: ip # ip地址
  KONG_PG_USER: kong      # 用户名直接写死为 kong
  KONG_PG_PASSWORD: ggbhack  # 密码直接写死为 ggbhack

volumes:
  kong_data:
    driver: local
    driver_opts:
      type: none
      device: ./kong_data
      o: bind
  kong_prefix_vol:
    driver: local
    driver_opts:
      type: none
      device: ./kong_prefix_vol
      o: bind
  kong_tmp_vol:
    driver: local
    driver_opts:
      type: none
      device: ./kong_tmp_vol
      o: bind

networks:
  kong-net:
    external: false
    # driver: bridge

services:
  kong-migrations:
    image: "${KONG_DOCKER_TAG:-kong:latest}"
    command: kong migrations bootstrap
    profiles: ["database"]
    depends_on:
      - db
    environment:
      <<: *kong-env
    networks:
      - kong-net
    restart: on-failure

  kong-migrations-up:
    image: "${KONG_DOCKER_TAG:-kong:latest}"
    command: kong migrations up && kong migrations finish
    profiles: ["database"]
    depends_on:
      - db
    environment:
      <<: *kong-env
    networks:
      - kong-net
    restart: on-failure

  kong:
    image: "${KONG_DOCKER_TAG:-kong:latest}"
    user: "${KONG_USER:-kong}"
    container_name: kong
    environment:
      <<: *kong-env
      KONG_ADMIN_ACCESS_LOG: /dev/stdout
      KONG_ADMIN_ERROR_LOG: /dev/stderr
      KONG_PROXY_LISTEN: "${KONG_PROXY_LISTEN:-0.0.0.0:8000}"
      KONG_ADMIN_LISTEN: "${KONG_ADMIN_LISTEN:-0.0.0.0:8001}"
      KONG_ADMIN_GUI_LISTEN: "${KONG_ADMIN_GUI_LISTEN:-0.0.0.0:8002}"
      KONG_PROXY_ACCESS_LOG: /dev/stdout
      KONG_PROXY_ERROR_LOG: /dev/stderr
      KONG_PREFIX: ${KONG_PREFIX:-/var/run/kong}
      KONG_DECLARATIVE_CONFIG: "/opt/kong/kong.yaml"
      KONG_DNS_RESOLVER: "ip:8600"  # 使用 consul 服务作为 DNS 解析器
    networks:
      - kong-net
    ports:
      - "${KONG_INBOUND_PROXY_LISTEN:-0.0.0.0}:8000:8000/tcp"
      - "${KONG_INBOUND_SSL_PROXY_LISTEN:-0.0.0.0}:8443:8443/tcp"
      - "8001:8001/tcp"
      - "8444:8444/tcp"
      - "8002:8002/tcp"
    healthcheck:
      test: ["CMD", "kong", "health"]
      interval: 10s
      timeout: 10s
      retries: 10
    restart: on-failure:5
    read_only: true
    volumes:
      - kong_prefix_vol:${KONG_PREFIX:-/var/run/kong}
      - kong_tmp_vol:/tmp
      - ./config:/opt/kong
    security_opt:
      - no-new-privileges
  consul:
    image: hashicorp/consul:latest
    container_name: consul
    profiles: ["database"]
    ports:
      - "8500:8500" # Consul UI 和 API
      - "8600:8600/udp" # DNS 解析端口(UDP)
    environment:
      CONSUL_BIND_INTERFACE: eth0
    command: agent -server -ui -bootstrap-expect=1 -client=0.0.0.0
    volumes:
      - ./consul/data:/consul/data
      - ./consul/config:/consul/config
    networks:
      - kong-net

  db:
    image: postgres:9.5
    container_name: kong-db
    profiles: ["database"]
    environment:
      POSTGRES_DB: ${KONG_PG_DATABASE:-kong}
      POSTGRES_USER: kong  # 用户名 kong
      POSTGRES_PASSWORD: ggbhack  # 密码 ggbhack
    healthcheck:
      test:
        [
          "CMD",
          "pg_isready",
          "-d",
          "${KONG_PG_DATABASE:-kong}",
          "-U",
          "kong"  # 使用 kong 作为数据库用户
        ]
      interval: 30s
      timeout: 30s
      retries: 3
    restart: on-failure
    stdin_open: true
    tty: true
    networks:
      - kong-net
    volumes:
      - kong_data:/var/lib/postgresql/data
    ports:
      - 5432:5432
  konga:
    image: pantsel/konga:latest
    container_name: konga
    environment:
      KONGA_HOST: "http://kong:8001"  # Kong Admin API 地址
      DB_ADAPTER: "postgres"         # 数据库适配器类型
      DB_URI: "postgres://kong:password@db:5432/kong"  # Konga 使用的数据库 URI
    ports:
      - "1337:1337"  # Konga Web UI 端口
    networks:
      - kong-net
    depends_on:
      - kong
      # - db
    restart: always

遇到的问题

报错 访问接口 ip:port/g/v1/goods 【这是我go搭建的 微服务其中的一个服务接口】

Error

failed the initial dns/balancer resolve for 'goods-web.service.consul' with: failed to receive reply from UDP server ip(外网ip):8600: connection refused.

request_id: b0d489023418a7508565f5411b5a5f6c

总结下来就是 dns解析失败

nacos 配置

consul 状态

service+routes 定义

解决方案

① 确保 以上启动正常,并且kong和consul在同一个 编排下

② 我使用的是外网访问 - 将 consul 开放出去【一开始我开放的是tcp,后面改为了udp】这里是关键 - 之后就正常访问啦

我在网上找了,也没有找到什么方案 - 问题的关键还是在配置上;弄了几个小时,终于搞定

相关推荐
me8322 小时前
【Linux docker】关于Docker 守护程序配置远程访问,安全认证以及idea连接。
linux·安全·docker
笑远2 小时前
AWS容器化部署指南
docker·容器·aws
me8322 小时前
【Linux docker 容器】关于想要让虚拟机在开机时候也docker自己启动,容器也自己启动,省去要自己开docker和容器
java·linux·docker·云原生·eureka
nukix4 小时前
Docker Compose 部署 steamcmd 安装奈斯服务端
java·服务器·docker
法号:吃肉5 小时前
语音识别-FunASR-docker部署-【超简洁步骤】
人工智能·docker·语音识别
敏捷利齐5 小时前
docker不停机部署
运维·docker·容器
Narutolxy17 小时前
Ubuntu 下 Docker 企业级运维指南:核心命令与最佳实践深度解析20250309
运维·ubuntu·docker
Yuanymoon19 小时前
【由技及道】镜像星门开启:Harbor镜像推送的量子跃迁艺术【人工智障AI2077的开发日志010】
java·docker·jenkins·harbor·devops
dleei21 小时前
使用docker创建gitlab仓库
前端·docker·gitlab
Hellc0071 天前
使用 Docker 部署 RabbitMQ 并实现数据持久化
docker·rabbitmq·ruby