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

Posted

技术标签:

【中文标题】docker 容器中的 Keycloak + 主机上的 MySQL 提供 [org.keycloak.services] (ServerService 线程池 -- 62) 无法连接到数据库【英文标题】:Keycloak in docker container + MySQL on host gives [org.keycloak.services] (ServerService Thread Pool -- 62) Failed to connect to database 【发布时间】:2020-09-18 07:46:02 【问题描述】:

KeyCloak 新手。

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

遵循enter link description here 中的步骤,当 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

甚至

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

出现以下错误:

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

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

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

在 Internet 上搜索所谓的“生产就绪”场景,即 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

关于无法连接到数据库的详细信息:

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

【问题讨论】:

【参考方案1】:

知道了。原来我需要允许 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>';

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

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

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

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

【讨论】:

嗨,您的意思是我们需要找出 Keycloak 容器的 IP 地址吗?在首先创建容器之前,我应该如何获取 Keycloak 容器的 IP 地址?我使用 docker-compose 创建 Keycloak 容器。 只需在分离模式下运行 (-d) 并快速复制容器 id 并在单独的终端中运行当前命令:“docker inspect -f 'range.NetworkSettings.Networks.IPAddress end' container_name_or_id”。在下一个容器中它不会改变。 答案已过时。不要使用 MYSQL_DATABASE 等... DB_DATABASE 现在是正确的答案【参考方案2】:

接受的答案可能已过时。

-e MYSQL_DATABASE=keycloak -e MYSQL_USERNAME=keycloak

应替换为:

-e DB_USER=keycloak -e DB_PASSWORD=keycloak

【讨论】:

【参考方案3】:

这里是任何使用 Plesk 和 keycloak docker 的人的答案。这就是我在我的服务器上执行此操作以使一切运行的方式:

至于我的 Docker 环境变量:

DB_DATABASE: keycloak
DB_USER: keycloak
DB_PASSWORD:my_password
DB_VENDOR:mariadb
DB_ADDR:172.17.0.1

对于数据库用户,我已将远程访问设置为某个 IP 范围:

172.17.0.%

所以我不需要知道具体的 docker ip

您还需要将为 keycloak 创建的数据库排序规则设置为 latin2_general_ci

最后一步,对我来说整个技巧就是将数据库服务器设置为侦听所有网络接口(Plesk Obsidian): 工具和设置 -> 数据库服务器 -> 点击本地 MySQL 设置链接 -> 勾选“允许本地 MySQL 服务器接受外部连接 -> 点击确定

如果您对此设置有任何安全提示,请告诉我。

这里有一些对我有帮助的参考资料:

https://support.plesk.com/hc/en-us/articles/213904365-How-to-enable-remote-access-to-MySQL-server-in-Plesk- https://hub.docker.com/r/jboss/keycloak/ https://forums.docker.com/t/container-cannot-connect-to-the-hosts-mysql-database/3493/3

【讨论】:

以上是关于docker 容器中的 Keycloak + 主机上的 MySQL 提供 [org.keycloak.services] (ServerService 线程池 -- 62) 无法连接到数据库的主要内容,如果未能解决你的问题,请参考以下文章

将整个目录从容器复制到主机

在 plesk 的 docker 容器上运行 keycloak 服务器的问题

dockerized 环境中的 Keycloak 和 Spring Boot Web 应用程序

Docker/Symfony/Reactjs/Keycloak:如何使用分离的 docker-compose 文件从一个容器向另一个容器发出 HTTP 请求?

Keycloak Docker 容器重启后无法启动

keycloak 容器正在重新启动,但出现错误 docker-compose