【问题标题】:communication between docker containers (keycloak and spring)docker容器之间的通信(keycloak和spring)
【发布时间】:2020-04-12 02:32:44
【问题描述】:

所以我创建了一个 java spring boot 应用程序,它使用 Keycloak 对其用户进行身份验证。 当我从 docker-compose 运行 keycloak 时,我可以在将应用程序作为独立 jar 文件运行或调试时成功进行身份验证。但是当我将我的 Spring Boot 应用程序作为 docker 容器放入 docker-compose 时。我无法再对用户进行身份验证。

我来自 spring boot docker 容器的错误日志:

springBootApp  | 2019-12-19 13:16:41.498 ERROR 1 --- [nio-8081-exec-2] o.k.a.rotation.JWKPublicKeyLocator       : Error when sending request to retrieve realm keys
springBootApp  | 
springBootApp  | org.keycloak.adapters.HttpClientAdapterException: IO error

我认为问题出在网络上。但所有容器都在同一个虚拟网络中运行。它们也在同一个 docker-compose 文件中。

这是我的钥匙斗篷部分:

  keycloak:
    image: jboss/keycloak
    ports:
      - 18080:8080
    volumes:
        - ../keycloak:/opt/jboss/keycloak/imports
    command: 
        - "-b 0.0.0.0 -Dkeycloak.import=/opt/jboss/keycloak/imports/realm-export.json"
    environment:
              - KEYCLOAK_USER=admin
              - KEYCLOAK_PASSWORD=admin

我的春季启动应用程序

  mySpringBootApp:
    image: mySpringBootApp:master-1
    environment:
      - SPRING_PROFILES_ACTIVE=developmentTest
    depends_on: 
      - jaeger
      - keycloak
      - db
    ports:
      - "8081:8081"

当我尝试使用 curl localhost:18080 来自我的主人。我得到了回应。 当我尝试使用 springBootApp docker 中的 curl 时,连接被拒绝。所以我假设即使他们在同一个网络中,他们也看不到对方。

【问题讨论】:

  • 我也遇到了同样的问题,你最后是怎么解决的?
  • 是的,实际上你必须在 docker 容器中使用 keycloak 的 IP 地址。您还可以从 docker 容器中通过主机名 so (keycloak:18080) 调用 keycloak。检查 docker 网络文档以获取解释

标签: java spring docker


【解决方案1】:

我会在 docker compose 中为您的服务定义网络,例如:

services:
  app:
    image: some-image
    networks:
      - my-network-name

networks:
  my-network-name:
   name: my-global-net

您可以确定,服务在同一个网络中,并且通过服务的名称相互交流。

【讨论】:

    【解决方案2】:

    您必须记住,您的 docker 容器与运行它的主机是隔离的。您计算机的 localhost 与 docker 容器内部的 localhost 不同。

    您正在使用 docker-compose 并且两个服务都在同一个 docker-compose.yaml 配置中,这意味着您可以使用服务的服务名称从同一个 docker-compose 文件中的另一个服务中访问它。

    在您的情况下,您要访问的服务称为 keycloak,并且您已将其端口映射为 18080:8080,这意味着从您的计算机 localhost 18080 访问此特定容器的端口 8080。

    为了访问此容器(或 docker-compose 上下文中的服务),您需要将 localhost 替换为您的服务名称。

    在您的情况下,要从 mySprngBootApp 容器中卷曲 keycloak 容器,您需要将 lcalhost 替换为服务名称,长话短说:curl keycloak:18080

    【讨论】:

    • 使用 docker exec springBootApp curl keycloak:18080 不起作用。我是否必须指定其他东西才能在 springbootapp docker 中使用 keycloak。我如何更改我的 docker 容器以便它们与 localhost 一起使用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-17
    • 1970-01-01
    • 1970-01-01
    • 2018-02-18
    • 1970-01-01
    • 2018-04-30
    • 2021-05-03
    相关资源
    最近更新 更多