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

meD*_*Dev 8 mysql docker keycloak

KeyCloak 新手。

尝试在将访问主机上的 MySQL 的容器中运行 KeyCloak(当前为 Windows 10,生产环境为 Linux)

按照此处输入链接描述中的步骤进行操作,当 KeyCloak 和 MySQL 都在自己的容器中时,它会根据那里的文档工作。

当尝试连接主机上现有的 MySQL 数据库并运行 KeyCloak docker 容器时,如下所示:

> docker run --name keycloak --network="host" -e DB_VENDOR=mysql -e DB_ADDR=host.docker.internal -e MYSQL_DATABASE=keycloak -e MYSQL_USERNAME=root -e MYSQL_PASSWORD=sqlpass -e KEYCLOAK_USER=kc-admin -e KEYCLOAK_PASSWORD=password jboss/keycloak
Run Code Online (Sandbox Code Playgroud)

甚至

docker run --name keycloak --network=host -e DB_VENDOR=MYSQL -e DB_ADDR=<actual ip address of host> -e MYSQL_DATABASE=keycloak -e MYSQL_USERNAME=root -e MYSQL_PASSWORD=sqlpass -e KEYCLOAK_USER=kc-admin -e KEYCLOAK_PASSWORD=password jboss/keycloak
Run Code Online (Sandbox Code Playgroud)

出现以下错误:

WFLYCTL0186:   Services which failed to start:      service org.wildfly.clustering.jgroups.channel.ee: java.lang.IllegalStateException: java.net.BindException: [UDP] /172.18.0.1 is not a valid address on any local network interface
Run Code Online (Sandbox Code Playgroud)

我认为在这些消息之后它就失败了......

19:33:30,381 INFO  [org.jboss.as.server.deployment] (MSC service thread 1-1) WFLYSRV0027: Starting deployment of "keycloak-server.war" (runtime-name: "keycloak-server.war")
19:33:30,522 INFO  [org.wildfly.extension.undertow] (MSC service thread 1-2) WFLYUT0006: Undertow HTTPS listener https listening on 0.0.0.0:8443
Run Code Online (Sandbox Code Playgroud)

在互联网上搜索了所谓的“生产就绪”场景,其中 MySQL 数据库将位于主机上,KeyCloak 可能位于 Docker 容器中,但没有找到太多帮助。

我究竟做错了什么?任何帮助/指示表示赞赏。谢谢。

更新:

当尝试删除网络时 - 出现不同的错误。

docker run --rm --name keycloak  -e DB_VENDOR=MYSQL  -e DB_ADDR=docker.host.internal -e MYSQL_DATABASE=keycloak -e MYSQL_USERNAME=root -e MYSQL_PASSWORD=sqlpass -e KEYCLOAK_USER=kc-admin -e KEYCLOAK_PASSWORD=password jboss/keycloak
Run Code Online (Sandbox Code Playgroud)

关于无法连接到数据库的更具体信息:

20:14:28,844 FATAL [org.keycloak.services] (ServerService Thread Pool -- 62) java.lang.RuntimeException: Failed to connect to database
Run Code Online (Sandbox Code Playgroud)

meD*_*Dev 6

知道了。事实证明,我需要允许 MySQL 实例中的“keycloak”用户远程登录(意味着不仅从本地主机登录,还包括任何其他主机)。

我使用以下脚本为“keycloak”用户授予访问权限:

USE keycloak;

CREATE USER 'keycloak'@'localhost' IDENTIFIED WITH caching_sha2_password  BY 'password';
CREATE USER 'keycloak'@'<ip address of container>' IDENTIFIED WITH caching_sha2_password  BY 'password';

GRANT ALL PRIVILEGES ON keycloak.* TO 'keycloak'@'localhost';
GRANT ALL PRIVILEGES ON keycloak.* TO 'keycloak'@'<ip address of container>';
Run Code Online (Sandbox Code Playgroud)

然后使用以下命令将 keycloak docker 镜像作为守护进程运行:

docker run --rm --name keycloak -d  -p 8080:8080 -e DB_VENDOR=MYSQL -e DB_ADDR=host.docker.internal -e MYSQL_DATABASE=keycloak -e MYSQL_USERNAME=keycloak -e MYSQL_PASSWORD=password -e KEYCLOAK_USER=kc-admin -e KEYCLOAK_PASSWORD=password jboss/keycloak
Run Code Online (Sandbox Code Playgroud)

然后转到http://localhost:8080/auth访问 KeyCloak 管理控制台并使用之前定义的 kc-admin 用户凭据登录。

要找出容器的 IP 地址,请从此线程中使用 Windows 命令行:How to get a Docker container's IP address from the host