如何使用同一主机名从Docker Compose内外访问Keycloak服务?
解决方法
可以实现用同一主机名从Docker Compose内外访问Keycloak,核心是让宿主机和容器都能解析同一个域名到Keycloak,并且Keycloak生成的JWT令牌中的issuer地址与验证时使用的地址完全一致。具体操作如下:
1. 配置本地Hosts文件
在宿主机的hosts文件中添加域名映射,让id.mydomain.local指向本地回环地址:
- Windows:编辑
C:\Windows\System32\drivers\etc\hosts,添加一行:127.0.0.1 id.mydomain.local - Linux/macOS:编辑
/etc/hosts,添加同样内容。
这样宿主机就能通过http://id.mydomain.local:9080访问Keycloak。
2. 修改Docker Compose配置
调整Keycloak和restapi的配置,统一访问地址并确保容器能解析该域名:
services: keycloak: image: keycloak:latest ports: - "9080:8080" environment: # 指定Keycloak的外部访问地址,确保生成的JWT issuer为该地址 KEYCLOAK_FRONTEND_URL: http://id.mydomain.local:9080/auth # 启用代理地址转发,适配端口映射场景 PROXY_ADDRESS_FORWARDING: "true" # 补充Keycloak基础配置示例 KEYCLOAK_ADMIN: admin KEYCLOAK_ADMIN_PASSWORD: admin restapi: image: restapi:latest ports: - "10080:8080" environment: # 使用统一域名访问Keycloak,与JWT issuer地址保持一致 KEYCLOAK: http://id.mydomain.local:9080 KEYCLOAK_REALM: myrealm # 其他OIDC客户端配置(如client secret等) extra_hosts: # 让容器内部将id.mydomain.local解析到宿主机网关,通过端口映射访问Keycloak - "id.mydomain.local:host-gateway"
3. 验证效果
- 宿主机IDE中的应用:通过
http://id.mydomain.local:9080获取JWT令牌,调用restapi时传递该令牌。 - restapi容器:通过
http://id.mydomain.local:9080访问Keycloak验证令牌,此时令牌中的issuer地址与验证地址完全匹配,验证将成功通过。
关键说明
KEYCLOAK_FRONTEND_URL:强制Keycloak使用指定的外部地址生成JWT的issuer字段,避免容器内部服务名导致的地址不一致。extra_hosts:让restapi容器能解析id.mydomain.local到宿主机,通过端口映射访问Keycloak,保证内外访问地址统一。PROXY_ADDRESS_FORWARDING:当Keycloak通过端口映射暴露时,启用该配置让Keycloak正确识别外部访问地址。
内容的提问来源于stack exchange,提问作者saw303
相关产品推荐
相关产品推荐

