在docker容器中使用Keycloak + 在宿主机上使用MySQL会出现[org.keycloak.services](ServerService线程池 - 62)无法连接到数据库的错误。
在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日
搞定了。原来我需要允许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地址