我正在使用 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
我找到了一种适合我设置的方法。
正如我的问题中提到的,
keycloak
容器端口8080
绑定到我的Docker主机上的9080
。我需要做的就是为 Keycloak 提供一个可以由我的 Docker 主机和 Docker 容器解析的通用主机名。
我选择了
my.keycloak.local
作为域名。
对于我的 Docker 主机,我只需将以下行添加到我的
/etc/hosts
文件中。
127.0.0.1 my.keycloak.local
这可以确保,当应用程序连接到
http://my.keycloak.local:9080
时,它将被路由到 127.0.0.1:9080
,因此将与我的 Keycloak 容器连接。
在 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 …