一个容器中的Spring应用程序无法访问另一个容器中的keycloak

2uluyalo  于 2023-02-21  发布在  Spring
关注(0)|答案(2)|浏览(197)

我们已经创建了使用keycloak保护的Spring应用程序,当我们尝试在Docker容器外运行它时,它工作正常,但当我们在两个单独的Docker容器中部署Spring应用程序和Keycloak时,它不工作:
我们的docker合成文件如下:

keycloak:
    image: quay.io/keycloak/keycloak:18.0
    hostname: keycloak
    environment:
      KC_DB: postgres
      KC_DB_URL: jdbc:postgresql://db:5432/app
      KC_DB_DATABASE: app
      KC_DB_USERNAME: postgres
      KC_DB_SCHEMA: public
      KC_DB_PASSWORD: root
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: password
      KEYCLOAK_USER: admin
      KEYCLOAK_PASSWORD: password
      KEYCLOAK_FRONTEND_URL: http://keycloak:8280
      KC_HOSTNAME_STRICT: "false"
      KC_EDGE: proxy
    ports:
      - 8280:8080
    command: 
      - start-dev
    networks:
      - network
security:
    container_name: security
    expose:
      - "9000"
    ports:
      - 9000:9000
    depends_on:
      - keycloak
    environment:
      - KEY_CLOAK=http://keycloak:8280
    networks:
      - network
networks:
  network:
    driver: bridge

keycloak json文件如下所示:

{
  "realm": "Default",
  "auth-server-url": "${KEY_CLOAK}/",
  "ssl-required": "external",
  "resource": "Default",
  "verify-token-audience": true,
  "credentials": {
    "secret": "mlqYrlT2UBmKp2dcfgfdzi5xFnF35lJ"
  },
  "use-resource-role-mappings": true,
  "principal-attribute": "preferred_username"
}

在Docker容器中部署后,我们尝试在浏览器中访问它,它在安全应用程序中出现以下错误:

2023-02-20 15:08:50.934  WARN 1 --- [qtp993370665-30] o.keycloak.adapters.KeycloakDeployment   
: Failed to load URLs from http://keycloak:8280/realms/Default/.well-known/openid-configuration
org.apache.http.conn.HttpHostConnectException: Connect to keycloak:8280 [keycloak/172.31.0.5] failed: Connection refused
java.lang.NullPointerException: Cannot invoke "org.keycloak.common.util.KeycloakUriBuilder.clone()" because the return value of "org.keycloak.adapters.KeycloakDeployment.getAuthUrl()" is null

我知道有一些丢失的配置,但我无法找到它。请帮助任何人知道它。

j7dteeu8

j7dteeu81#

我认为当你在docker compose创建的docker网络内部时,你只能使用像http://keycloak:8280这样的url,而在外部(比如浏览器)你需要使用localhost。

ltskdhd1

ltskdhd12#

这里的问题是端口。您正在尝试访问您的keycloak * 在您的docker网络 * 内的端口8280。但8280实际上是用于从您的主机 * 访问docker网络 * 的端口。如果您想通过keycloak主机名访问keycloak,您需要使用在网络内使用的端口,即8080。

相关问题