从后端容器连接到 keycloak 容器时连接被拒绝

Posted

技术标签:

【中文标题】从后端容器连接到 keycloak 容器时连接被拒绝【英文标题】:Connection refused when connecting to keycloak container from backend container 【发布时间】:2021-02-25 13:30:31 【问题描述】:

我有两个容器后端(弹簧启动应用程序)和 Keycloak。如果我在容器中运行 keycloak 并在本地运行:它可以工作

如果它们都在容器中运行,则后端不会启动并显示以下错误:

Failed to instantiate [org.springframework.security.oauth2.jwt.JwtDecoder]: Factory method 'jwtDecoderByIssuerUri' threw exception; nested exception is java.lang.IllegalArgumentException: Unable to resolve the Configuration with the provided Issuer of "http://keycloak:8082/auth/realms/myrealm"

Caused by: org.springframework.web.client.ResourceAccessException: I/O error on GET request for "http://keycloak:8082/auth/realms/myrealm/.well-known/openid-configuration": Connection refused (Connection refused); 

以下是我的配置:

码头工人撰写:

services:

  keycloak:
    image: jboss/keycloak:8.0.1
    command:
      - " -b 0.0.0.0"
    container_name: "keycloak"
    networks:
      - myproject
    volumes:
      - "./keycloak/realm-export.json:/opt/jboss/keycloak/bin/keycloak_export_dir/realm-export.json"
    environment:
      KEYCLOAK_USER: admin
      KEYCLOAK_PASSWORD: admin
      KEYCLOAK_IMPORT: /opt/jboss/keycloak/bin/keycloak_export_dir/realm-export.json
    ports:
      - "8082:8080"

  backend:
    build:
      context: ./backend
      dockerfile: Dockerfile
    container_name: "backend"
    environment:
      - spring.oauth2.resourceserver.jwt.issuer-uri= http://keycloak:8082/auth/realms/myrealm
    links:
      - keycloak
    networks:
      - myproject
    restart: on-failure
    ports:
      - "8080:8080"

networks:
  myproject:
    driver: bridge

application.yml:

  application:
    name: backend
  security:
    oauth2:
      resourceserver:
        jwt:
          issuer-uri: http://localhost:8082/auth/realms/myrealm

你知道为什么我会被拒绝连接吗? 任何帮助表示赞赏:)

【问题讨论】:

【参考方案1】:

您的 Keycloak 容器使用以下端口配置

ports:
  - "8082:8080"

意思是:

Keycloak 可通过端口8082 从外部访问。

但是在内部(在这个 docker 网络中),keycloak 只能通过暴露的8080 端口访问。所以你的后端应用程序需要(内部)连接到http://keycloak:8080

【讨论】:

以上是关于从后端容器连接到 keycloak 容器时连接被拒绝的主要内容,如果未能解决你的问题,请参考以下文章

docker 容器中的 Keycloak + 主机上的 MySQL 提供 [org.keycloak.services] (ServerService 线程池 -- 62) 无法连接到数据库

403 Forbidden,docker容器之间的通信

后端容器 ip 无法使用 docker 连接到数据库 mysql

连接到 jmeter 从属 docker 容器时连接被拒绝错误

当应用程序在本地运行时,Node.js 能够连接到 MySQL 容器,但当应用程序在容器中运行时无法连接

尝试从Docker容器内部连接到DB时,“连接被拒绝”