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 请求?