我正在 callistaenterprise/blog-api-gateway-kong 中做教程:演示 Kong API 网关用法的示例项目。它在 MacOS 上运行良好。然而,我在 WSL2 Ubuntu 上设置相同的
docker-compose
时遇到了麻烦。
keycloak
容器设置为:
keycloak:
image: quay.io/keycloak/keycloak
ports:
- "9080:9080"
- "9443:9443"
environment:
KEYCLOAK_ADMIN: admin
KEYCLOAK_ADMIN_PASSWORD: admin
command:
- start-dev
- --db=dev-mem
- --hostname=host.docker.internal
- --http-port=9080
- --https-port=9443
- --https-certificate-file=/opt/keycloak/ssl/server/localhost.crt
- --https-certificate-key-file=/opt/keycloak/ssl/server/localhost.key
- --https-trust-store-file=/opt/keycloak/ssl/CA/localCA.p12
- --https-trust-store-password=secret
- --https-client-auth=request
- --import-realm
volumes:
- ./keycloak-test-realm.json:/opt/keycloak/data/import/realm.json
- ./certs:/opt/keycloak/ssl
并且
kong
容器通过以下方式访问 keycloak
:
- name: oidc
host: upstream
port: 80
protocol: http
plugins:
- name: oidc
config:
discovery: http://host.docker.internal:9080/realms/test/.well-known/openid-configuration
client_id: oidc-client
client_secret: secret
routes:
- name: oidc-route
paths:
- /oidc/
strip_path: true
本教程在
127.0.0.1 host.docker.internal
中添加了
/etc/hosts
条目
hosts
文件具有类似 10.171.xxx.xxx host.docker.internal
的条目,该条目无法访问,并且可能是由 Windows 10 的 Docker Desktop 放置在那里的,因此我将 generateHosts = false
放入 /etc/wsl.conf
文件中将 host.docker.internal
的 IP 地址设置为 127.0.0.1
问题是,当我执行
http http://host.docker.internal:8080/oidc/api
时,它又向http://host.docker.internal:9080/realms/test/.well-known/openid-configuration
发出请求并返回连接拒绝的错误。
network_mode: host
容器中添加 kong
选项,http http://host.docker.internal:8080/oidc/api
将返回 连接被对等方重置的错误。
keycloak
容器也有 network_mode: host
,错误将再次是 连接被拒绝但是在这两种情况下,
http http://host.docker.internal:9080/realms/test/.well-known/openid-configuration
都可以正常工作。
似乎是 Windows/WSL/Docker 网络设置问题。谁能解释一下吗?
尝试了不同的设置并设法使其正常工作。
host.docker.internal
始终是 Windows 主机,但 WSL 无法访问。
host.docker.internal
设置为 127.0.0.1
并使用 generateHosts = false
文件设置 /etc/wsl.conf
。唯一有效的配置是:
kong
和keycloak
容器都必须将网络模式设置为host
/etc/hosts:/etc/hosts
oidc
服务的 discovery
URL 更改为 http://keycloak:9080/realms/test/.well-known/openid-configuration
可以实现 Docker 间访问工作,但它会短暂停止,因为最后一步是 HTTP 重定向到 http://keycloak:9080/realms/test/protocol/openid-connect/auth
,但主机无法解决keycloak
keycloak