You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WSL2 Ubuntu环境下Kong容器连接KeyCloak容器失败求助

问题原因分析

  1. 容器回环地址误解:WSL2中手动将host.docker.internal指向127.0.0.1后,Kong容器内部访问该地址时,会指向容器自身的回环接口,而非WSL2主机或Windows主机上的KeyCloak服务,导致连接被拒绝。
  2. network_mode: host的网络栈冲突:WSL2的host网络模式与Windows的网络转发存在兼容性问题,容器共享WSL2网络栈后,KeyCloak配置的hostname=host.docker.internal可能导致绑定地址受限,加上跨网络的数据包转发限制,出现连接重置。
  3. Docker内部DNS解析优先级:即使修改了WSL2的hosts文件,Docker容器默认优先使用Docker Desktop提供的DNS服务,仍可能解析到错误的host.docker.internal地址。

解决方案

方案一:使用Docker服务名直接访问(推荐)

Docker Compose会为同一网络下的容器自动创建DNS解析,直接用KeyCloak的服务名替代host.docker.internal:
修改Kong的oidc配置中的discovery字段:

discovery: http://keycloak:9080/realms/test/.well-known/openid-configuration

此方案无需依赖外部网络解析,直接通过Docker内部网络通信,稳定性最高。

方案二:正确配置host.docker.internal指向Windows主机

  1. 恢复/etc/wsl.conf中的generateHosts = true,让Docker Desktop自动维护hosts条目。
  2. 在Windows终端执行ipconfig,找到vEthernet (WSL)的IPv4地址(通常为172.x.x.x或192.168.x.x)。
  3. 在WSL2的/etc/hosts中添加:[Windows网桥IP] host.docker.internal,不要指向127.0.0.1。
  4. 修改KeyCloak的启动命令,去掉--hostname=host.docker.internal,让其绑定到0.0.0.0:
command: 
  - start-dev
  - --db=dev-mem
  - --http-bind-address=0.0.0.0
  - --http-port=9080
  # 保留其他HTTPS相关参数

方案三:调整KeyCloak的绑定地址

修改KeyCloak的启动命令,强制绑定到容器的所有网卡地址,确保Kong容器能通过Docker网络访问:

command: 
  - start-dev
  - --db=dev-mem
  - --http-bind-address=0.0.0.0
  - --hostname=host.docker.internal
  - --http-port=9080
  # 保留其他HTTPS相关参数

验证步骤

修改配置后,重启Docker Compose服务:

docker-compose down && docker-compose up -d

执行请求测试:

http http://host.docker.internal:8080/oidc/api

内容的提问来源于stack exchange,提问作者hanaZ

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 17:32:01