Docker容器内Spring Boot应用跳转Keycloak的访问问题求助
我的环境如下:
- 运行Spring Boot后端应用的Docker容器
- 用于认证的Keycloak Docker容器
- 两个容器处于同一自定义Docker桥接网络
- 前端应用部署在宿主机
后端应用配置了环境变量KEYCLOAK_URL,供前后端共同使用,但该URL使用的是Docker桥接内部主机名,无法在宿主机浏览器中访问。
当用户访问前端应用时,前端向后端发起getUser请求,后端返回基于KEYCLOAK_URL生成的Keycloak登录授权URL,但该URL无法被浏览器正常访问。
我曾尝试将Spring Boot应用切换至Docker宿主机网络,并将KEYCLOAK_URL改为localhost:8180,但Windows Docker Desktop不支持宿主机网络模式。
docker-compose.yml 配置
version: '3.7' networks: net: driver: bridge external: false name: test-net services: postgres-db: image: postgres:13.1 container_name: postgres-db networks: - net ports: - 5432:5432 volumes: - ./init-postgresql.sql:/docker-entrypoint-initdb.d/1-init.sql:ro - ./postgres-data:/var/lib/postgresql/data:rw environment: LC_ALL: 'C.UTF-8' POSTGRES_USER: postgres POSTGRES_PASSWORD: postgres POSTGRES_HOST: postgres-db POSTGRES_DB: postgres PGDATA: /var/lib/postgresql/data restart: unless-stopped keycloak: image: quay.io/keycloak/keycloak:11.0.2 container_name: keycloak hostname: keycloak command: -Dkeycloak.profile.feature.upload_scripts=enabled networks: - net ports: - 8180:8080 environment: KEYCLOAK_USER: admin KEYCLOAK_PASSWORD: admin DB_VENDOR: POSTGRES DB_ADDR: postgres-db DB_USER: postgres DB_PASSWORD: postgres DB_DATABASE: keycloak DB_SCHEMA: public depends_on: - postgres-db restart: unless-stopped app: image: app container_name: app depends_on: - keycloak networks: - net ports: - 8083:8083 environment: KEYCLOAK_URL: http://keycloak:8080/auth restart: unless-stopped
1. 区分内部/外部Keycloak地址(推荐)
给Spring Boot后端配置两个环境变量,分别适配容器内部通信和前端访问场景:
KEYCLOAK_INTERNAL_URL: 保持http://keycloak:8080/auth,供后端内部调用Keycloak API使用(容器间通过自定义网络通信)KEYCLOAK_EXTERNAL_URL: 设置为宿主机可访问的地址,比如http://localhost:8180/auth(若需局域网其他机器访问,替换为宿主机局域网IP,如http://192.168.1.100:8180/auth)
后端处理前端getUser请求时,使用KEYCLOAK_EXTERNAL_URL生成登录授权URL返回给前端,确保浏览器能正常访问Keycloak授权页面。
2. 修改宿主机Hosts文件(Windows环境)
以管理员权限编辑Windows的C:\Windows\System32\drivers\etc\hosts文件,添加以下映射:
127.0.0.1 keycloak
修改后,宿主机浏览器会将keycloak主机名解析为本地回环地址。此时需调整Keycloak的端口映射为8080:8080(避免端口不一致),或在后端生成授权URL时将端口替换为8180。该方法无需修改后端代码,但需注意端口冲突问题。
3. 配置Keycloak Frontend URL
登录Keycloak管理控制台,进入对应Realm的设置页面,找到Frontend URL配置项,设置为宿主机可访问的地址http://localhost:8180/auth。该配置会让Keycloak在生成授权响应、回调URL时使用外部可访问地址,结合后端地址配置可解决前端访问问题。
内容的提问来源于stack exchange,提问作者Pavel Antropov

