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
相关产品推荐
相关产品推荐

