如何使用相同的主机名从 Docker 组合内部和外部访问服务?

问题描述 投票:0回答:1

我正在使用 Docker 组合来开发一组应用程序。其中一些作为 Docker 容器运行,而我正在开发的容器在 IDE 中的 Docker 主机上运行。

在我的作品中,我运行了 Keycloak,以使用 OpenID Connect 保护我的 API。此外,还有另一个公开 REST API 的容器(与 Keycloak 容器交互)。每个

services:
   keycloak:
      image: keycloak:latest
      ports:
        - "9080:8080"
   restapi:
      image: restapi:latest
      ports:
        - "10080:8080"
      environment:
        KEYCLOAK: http://keycloak # pointing to keycloak
        KEYCLOAK_REALM: myrealm
        # more OIDC client env vars such as client secret …

正如我在 Docker 主机上提到的,我开发了另一个由 Keycloak 保护的应用程序(可在 Docker 主机 127.0.0.1:9080 上访问)。当调用在我的 Docker 主机上运行的 REST API 并提供有效的 JWT 作为 BEARER 令牌时,请求将传播到

restapi
,包括 JWT。

--> Docker Host REST API --> 向容器restapi请求(带有令牌传播)

由于 Docker 主机访问

127.0.0.1:9080
上的 Keycloak 并且
restapi
到达
keycloak:8080
上的 Keycloak,令牌验证失败。主机名和端口不同。

有没有一种方法可以让 Keycloak 在 Docker 组合内部和外部使用相同的主机名和端口进行访问?

类似

id.mydomain.local
的东西将 Docker 在内部指向
keycloak
容器,在外部我将
id.mydomain.local
指向我的
/etc/hosts

docker dns
1个回答
0
投票

我找到了一种适合我设置的方法。

正如我的问题中提到的,

keycloak
容器端口
8080
绑定到我的Docker主机上的
9080
。我需要做的就是为 Keycloak 提供一个可以由我的 Docker 主机和 Docker 容器解析的通用主机名。

我选择了

my.keycloak.local
作为域名。

Docker 主机

对于我的 Docker 主机,我只需将以下行添加到我的

/etc/hosts
文件中。

127.0.0.1        my.keycloak.local

这可以确保,当应用程序连接到

http://my.keycloak.local:9080
时,它将被路由到
127.0.0.1:9080
,因此将与我的 Keycloak 容器连接。

在我的 Docker 组合中

在 Docker 组合内部,我需要添加一个附加的自定义主机记录,以便容器能够将

my.keycloak.local
解析为 Docker 主机 IP
172.17.0.1
。然后我需要告诉
restapi
容器使用自定义主机名
my.keycloak.local
连接到 Keycloak。

services:
   keycloak:
      image: keycloak:latest
      ports:
        - "9080:8080"
   restapi:
      image: restapi:latest
      ports:
        - "10080:8080"
      environment:
        KEYCLOAK: http://my.keycloak.local # pointing to keycloak
        KEYCLOAK_REALM: myrealm
      extra_hosts:
        - "my.keycloak.local:172.17.0.1"
        # more OIDC client env vars such as client secret …
© www.soinside.com 2019 - 2024. All rights reserved.