Java.net.ConnectException:Docker + Keycloak 拒绝连接
Java.net.ConnectException: Connection refused on Docker + Keycloak
我是 Docker 的新手,我很难将 Keycloak 连接到我的本地 MySQL 数据库。有没有人知道发生了什么事?这是我的Docker文件:
FROM jboss/keycloak:14.0.0
ADD JDBC_PING.cli /opt/jboss/tools/cli/jgroups/discovery/
USER root
ENV DB_VENDOR MYSQL
ENV DB_ADDR host.internal.docker
ENV DB_PORT 3306
ENV DB_DATABASE keycloak
ENV DB_USER root
ENV DB_PASSWORD mydbpass
ENV PROXY_ADDRESS_FORWARDING true
ENV KEYCLOAK_USER admin
ENV KEYCLOAK_PASSWORD mykcpass
ENV PROXY_ADDRESS_FORWARDING true
ENV JGROUPS_DISCOVERY_PROTOCOL JDBC_PING
ENV JGROUPS_DISCOVERY_PROPERTIES datasource_jndi_name=java:jboss/datasources/KeycloakDS
ENV CACHE_OWNERS_COUNT 2
ENV CACHE_OWNERS_AUTH_SESSIONS_COUNT 2
ENV JAVA_OPTS -server -Xms8048m -Xmx8048m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=512m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=$JBOSS_MODULES_SYSTEM_PKGS,com.newrelic -Djava.awt.headless=true
COPY . /project
RUN cd /project && ./mvnw clean package
FROM jboss/keycloak:14.0.0
USER root
COPY --from=0 /project/target/*.jar /opt/jboss/keycloak/standalone/deployments/app.jar
USER 1000
ENV KEYCLOAK_HTTP_PORT 80
ENV KEYCLOAK_HTTPS_PORT 443
EXPOSE 8080
EXPOSE 8443
错误日志显示:
FATAL [org.keycloak.services] (ServerService Thread Pool -- 59) Error during startup: java.lang.RuntimeException: Failed to connect to database
...............
Caused by: java.net.ConnectException: Connection refused (Connection refused)
at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.base/java.net.Socket.connect(Socket.java:609)
at com.mysql.jdbc@8.0.22//com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155)
at com.mysql.jdbc@8.0.22//com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63)
... 64 more
已采取的步骤:
- 禁用防火墙;
- 已将绑定地址:0.0.0.0 添加到我的 my.cnf 文件中;
- root@% 已经拥有所有权限;
- 尝试在所有可能的配置中设置 DB_ADDR 和 DB_VENDOR;
- 服务器已经启动,通过 Workbench 的连接运行正常。
任何帮助将不胜感激!!
在多阶段构建中,每个 FROM
行都会完全重置 ENV
设置,因此第一阶段的设置不会出现在最终图像中。
FROM jboss/keycloak:14.0.0 AS build
ENV DB_VENDOR MYSQL
...
FROM jboss/keycloak:14.0.0 # resets ENV settings
RUN echo $DB_VENDOR # will be empty
一般来说,运行 时间或部署时设置(如数据库位置和凭据)不应编译到您的 Docker 文件中。 (当您将映像部署到不同的地方时,您不想重建映像,并且可以很容易地从构建的映像中提取凭据。)如果您 运行 通过 Docker 撰写,您可以将这些特定于环境的设置放入 docker-compose.yml
文件中,或者 use an external environment file:
version: '3.8'
services:
keycloak:
build: .
# env_file: keycloak.env # would replace the settings below
environment:
DB_ADDR: host.internal.docker
DB_USER: root
DB_PASSWORD: password
ET: cetera
我是 Docker 的新手,我很难将 Keycloak 连接到我的本地 MySQL 数据库。有没有人知道发生了什么事?这是我的Docker文件:
FROM jboss/keycloak:14.0.0
ADD JDBC_PING.cli /opt/jboss/tools/cli/jgroups/discovery/
USER root
ENV DB_VENDOR MYSQL
ENV DB_ADDR host.internal.docker
ENV DB_PORT 3306
ENV DB_DATABASE keycloak
ENV DB_USER root
ENV DB_PASSWORD mydbpass
ENV PROXY_ADDRESS_FORWARDING true
ENV KEYCLOAK_USER admin
ENV KEYCLOAK_PASSWORD mykcpass
ENV PROXY_ADDRESS_FORWARDING true
ENV JGROUPS_DISCOVERY_PROTOCOL JDBC_PING
ENV JGROUPS_DISCOVERY_PROPERTIES datasource_jndi_name=java:jboss/datasources/KeycloakDS
ENV CACHE_OWNERS_COUNT 2
ENV CACHE_OWNERS_AUTH_SESSIONS_COUNT 2
ENV JAVA_OPTS -server -Xms8048m -Xmx8048m -XX:MetaspaceSize=96M -XX:MaxMetaspaceSize=512m -Djava.net.preferIPv4Stack=true -Djboss.modules.system.pkgs=$JBOSS_MODULES_SYSTEM_PKGS,com.newrelic -Djava.awt.headless=true
COPY . /project
RUN cd /project && ./mvnw clean package
FROM jboss/keycloak:14.0.0
USER root
COPY --from=0 /project/target/*.jar /opt/jboss/keycloak/standalone/deployments/app.jar
USER 1000
ENV KEYCLOAK_HTTP_PORT 80
ENV KEYCLOAK_HTTPS_PORT 443
EXPOSE 8080
EXPOSE 8443
错误日志显示:
FATAL [org.keycloak.services] (ServerService Thread Pool -- 59) Error during startup: java.lang.RuntimeException: Failed to connect to database
...............
Caused by: java.net.ConnectException: Connection refused (Connection refused)
at java.base/java.net.PlainSocketImpl.socketConnect(Native Method)
at java.base/java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:399)
at java.base/java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:242)
at java.base/java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:224)
at java.base/java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.base/java.net.Socket.connect(Socket.java:609)
at com.mysql.jdbc@8.0.22//com.mysql.cj.protocol.StandardSocketFactory.connect(StandardSocketFactory.java:155)
at com.mysql.jdbc@8.0.22//com.mysql.cj.protocol.a.NativeSocketConnection.connect(NativeSocketConnection.java:63)
... 64 more
已采取的步骤:
- 禁用防火墙;
- 已将绑定地址:0.0.0.0 添加到我的 my.cnf 文件中;
- root@% 已经拥有所有权限;
- 尝试在所有可能的配置中设置 DB_ADDR 和 DB_VENDOR;
- 服务器已经启动,通过 Workbench 的连接运行正常。
任何帮助将不胜感激!!
在多阶段构建中,每个 FROM
行都会完全重置 ENV
设置,因此第一阶段的设置不会出现在最终图像中。
FROM jboss/keycloak:14.0.0 AS build
ENV DB_VENDOR MYSQL
...
FROM jboss/keycloak:14.0.0 # resets ENV settings
RUN echo $DB_VENDOR # will be empty
一般来说,运行 时间或部署时设置(如数据库位置和凭据)不应编译到您的 Docker 文件中。 (当您将映像部署到不同的地方时,您不想重建映像,并且可以很容易地从构建的映像中提取凭据。)如果您 运行 通过 Docker 撰写,您可以将这些特定于环境的设置放入 docker-compose.yml
文件中,或者 use an external environment file:
version: '3.8'
services:
keycloak:
build: .
# env_file: keycloak.env # would replace the settings below
environment:
DB_ADDR: host.internal.docker
DB_USER: root
DB_PASSWORD: password
ET: cetera