在docker容器中使用Keycloak + 在宿主机上使用MySQL会出现[org.keycloak.services](ServerService线程池 - 62)无法连接到数据库的错误。

9 浏览
0 Comments

在docker容器中使用Keycloak + 在宿主机上使用MySQL会出现[org.keycloak.services](ServerService线程池 - 62)无法连接到数据库的错误。

初次使用KeyCloak。

尝试在容器中运行KeyCloak,该容器将访问主机上的MySQL(当前为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

或者甚至是:

docker run --name keycloak --network=host -e DB_VENDOR=MYSQL -e DB_ADDR= -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

在互联网上寻找所谓的“生产就绪场景”,在其中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

admin 更改状态以发布 2023年5月23日
0
0 Comments

所接受的答案可能已经过时了。

-e MYSQL_DATABASE=keycloak -e MYSQL_USERNAME=keycloak

应该被替换为:

-e DB_USER=keycloak -e DB_PASSWORD=keycloak

0
0 Comments

搞定了。原来我需要允许MySQL实例中的'keycloak'用户以远程方式登录(即不仅限于本地主机,还可以来自其他主机)。

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

USE keycloak;
CREATE USER 'keycloak'@'localhost' IDENTIFIED WITH caching_sha2_password  BY 'password';
CREATE USER 'keycloak'@'' IDENTIFIED WITH caching_sha2_password  BY 'password';
GRANT ALL PRIVILEGES ON keycloak.* TO 'keycloak'@'localhost';
GRANT ALL PRIVILEGES ON keycloak.* TO 'keycloak'@'';

然后使用以下命令作为守护进程运行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

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

要找出容器的IP地址,可以使用来自此线程的Windows命令行:如何从主机获取Docker容器的IP地址

0