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

如何使用同一主机名从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 21:05:54