Docker Compose部署下微服务无法连接Keycloak求助
问题描述
本地机器5432端口部署PostgreSQL,通过Docker Compose构建多Spring Boot微服务,数据库连接问题已解决,但adm服务无法连接Keycloak:
- 初始在adm的
application-local.yaml中配置Keycloak的issuer-uri为http://localhost:8083/realms/my-app,启动报错:Unable to resolve Configuration with the provided Issuer of "http://localhost:8083/realms/my-app"
- 替换为容器服务名
http://keycloak:8083/realms/my-app后,仍出现相同的Issuer解析失败错误 - 本地直接运行服务时一切正常,已提供相关Dockerfile、compose.yaml、配置文件及报错日志
排查与解决步骤
1. 验证容器间网络连通性
进入adm容器内部,测试与Keycloak服务的网络连通:
docker exec -it <adm-container-name> ping keycloak
- 如果ping不通:
- 检查compose.yaml中adm和Keycloak是否在同一自定义网络(Compose默认生成专属网络,若手动指定多个网络需确认归属)
- 确认Keycloak服务的
container_name或服务名确实为keycloak,避免拼写错误
2. 确保Keycloak完全就绪后再启动adm
Keycloak启动耗时较长,adm可能在Keycloak未就绪时发起请求:
- 在compose.yaml中给adm添加依赖与健康检查,等待Keycloak就绪:
services: keycloak: # 原有配置 healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8083/realms/my-app/.well-known/openid-configuration"] interval: 10s timeout: 5s retries: 5 adm: # 原有配置 depends_on: keycloak: condition: service_healthy - 查看Keycloak日志确认服务与realm启动成功:
日志需包含docker logs <keycloak-container-name>Realm 'my-app' created或Server started类信息
3. 检查Keycloak Realm的公开地址配置
Keycloak自身的issuer地址需与adm请求地址匹配:
- 登录Keycloak管理控制台(本地访问
http://localhost:8083/admin),进入my-apprealm的Realm Settings → General - 将Frontend URL设置为
http://keycloak:8083/(容器内部访问地址),避免Keycloak返回与adm请求不一致的issuer地址
4. 确认adm服务加载了正确的配置
验证adm确实使用了application-local.yaml:
- 进入adm容器查看配置文件内容:
docker exec -it <adm-container-name> cat /path/to/application-local.yaml - 检查启动命令是否指定了正确的profile,比如Dockerfile中是否有:
CMD ["java", "-jar", "adm-service.jar", "--spring.profiles.active=local"]
5. 直接测试Keycloak的OIDC配置端点
在adm容器内部curl Keycloak的配置端点,确认服务可达:
docker exec -it <adm-container-name> curl http://keycloak:8083/realms/my-app/.well-known/openid-configuration
- 返回正常JSON:网络与Keycloak服务正常,需检查Spring Boot Keycloak客户端的额外配置(比如client-id、client-secret是否正确)
- 返回错误:根据提示(连接超时/404)进一步排查网络或Keycloak realm配置
内容的提问来源于stack exchange,提问作者dSofarts
相关产品推荐
相关产品推荐

