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

Docker Compose中Spring Boot容器无法连接Keycloak容器求助

问题诊断与解决

核心问题

容器间通信误用了宿主机映射端口而非容器内部端口:
Keycloak容器内部监听端口为8080,8989是宿主机的映射端口,Spring Boot容器尝试访问keycloak-prod:8989时,容器内部无服务监听该端口,导致连接拒绝。

具体修复步骤

1. 修正Spring Boot的Keycloak访问地址

修改docker-compose.yml中remind-me服务的KEYCLOAK_URL环境变量,使用容器内部可访问的地址(推荐用服务名,无需固定IP):

environment:
  - SPRING_DATASOURCE_URL=jdbc:postgresql://psql-db:5432/postgres
  - SPRING_DATASOURCE_USERNAME=postgres
  - SPRING_DATASOURCE_PASSWORD=xxx
  # 使用服务名+容器内部端口(推荐)
  - KEYCLOAK_URL=http://keycloak-prod:8080/realms/remind-me
  # 或使用固定IP+容器内部端口
  # - KEYCLOAK_URL=http://172.20.0.2:8080/realms/remind-me

2. 配置Keycloak适配内外访问

为了让Keycloak生成的令牌issuer地址同时兼容外部客户端(浏览器/Postman)和内部Spring Boot服务,给keycloak-prod服务添加以下环境变量:

environment:
  - KEYCLOAK_ADMIN=xxx
  - KEYCLOAK_ADMIN_PASSWORD=xxx
  # 外部客户端访问的地址
  - KC_HOSTNAME_URL=http://localhost:8989
  - KC_HOSTNAME_ADMIN_URL=http://localhost:8989
  # 允许代理模式,适配内外URL差异
  - KC_PROXY=edge

3. 重启容器验证

执行命令重启所有容器:

docker-compose down
docker-compose up --build

额外注意事项

  • depends_on仅保证容器启动顺序,不保证服务就绪。如果Spring Boot启动时Keycloak未初始化完成,可能出现临时连接失败,可添加wait-for-it等脚本确保Keycloak服务就绪后再启动Spring Boot。
  • Spring Boot的application.properties中spring.security.oauth2.resourceserver.jwt.issuer-uri和jwk-set-uri已正确引用${KEYCLOAK_URL},无需修改。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 04:14:53