Docker网络 - Keycloak无法连接到运行在独立Docker实例中的PostgreSQL

5

我有两个Docker容器,一个运行Keycloak 4.7.0.Final,另一个运行Postgresql。

Keycloak Dockerfile

FROM jboss/keycloak:4.7.0.Final

ADD themes/mytheme /opt/jboss/keycloak/themes/healthjoiner

ADD modules /opt/jboss/keycloak/modules/system/layers/keycloak
ADD standalone-ha.xml /opt/jboss/keycloak/standalone/configuration/
ADD keycloak-config.json /opt/jboss/

RUN mkdir -p $JBOSS_HOME/standalone/data

CMD ["-b", "0.0.0.0", "-Dkeycloak.migration.action=import -Dkeycloak.migration.provider=singleFile -Dkeycloak.migration.file=/opt/jboss/keycloak-config.json -Dkeycloak.migration.strategy=OVERWRITE_EXISTING"]

Postgres Dockerfile

FROM postgres:9.5

# set root user details
ENV POSTGRES_PASSWORD=postgres
ENV POSTGRES_USER=postgres

ADD scripts/init.sql /docker-entrypoint-initdb.d/

# expose the 5432 port to outside the container
EXPOSE 5432

以下是standalone-ha.xml文件中有问题的部分,具体来说是connection-url的值。

<subsystem xmlns="urn:jboss:domain:datasources:5.0">
        <datasource jndi-name="java:jboss/datasources/KeycloakDS" pool-name="KeycloakDS" enabled="true"
                        use-java-context="true">
            <connection-url>jdbc:postgresql://my-net/keycloak</connection-url>
            <driver>postgresql</driver>
            <pool>
                <max-pool-size>20</max-pool-size>
            </pool>
            <security>
                <user-name>keycloak</user-name>
                <password>sa</password>
            </security>
        </datasource>
        <drivers>
            <driver name="postgresql" module="org.postgresql">
                <xa-datasource-class>org.postgresql.xa.PGXADataSource</xa-datasource-class>
            </driver>
        </drivers>
    </datasources>
</subsystem>

Postgres启动正常。当我启动Keycloak时,出现java.net.UnknownHostException: my-net错误。我也尝试使用localhost,但仍然出现相同的错误。

最后,我按照docker networking指南创建了一个用户定义的桥接网络。

docker network create --driver bridge my-net

我按照指南操作,但是无法让Keycloak找到PostgreSQL数据库。据我所知,网络my-net应该在运行Keycloak的容器内部可用。

任何帮助都将不胜感激。谢谢。

更新

PostgreSQL使用以下方式启动:

docker run --name postgresql -p 5432:5432 --network my-net postgresql

同时使用Keycloak:

docker run --name keycloak -p 8080:8180 --network my-net keycloak

你是如何启动容器的?我想查看一下你的容器的网络和名称配置。 - Jan Garaj
1
您需要修改XML文件以连接到Postgres吗?您可以按照官方的Docker Compose示例进行操作,链接在此 https://github.com/jboss-dockerfiles/keycloak/blob/master/docker-compose-examples/keycloak-postgres.yml。 - Ryan Dawson
@RyanDawson 我也尝试过那个方法,但是没有成功。不过我目前还没有使用docker compose。我已经将这些数据库值作为环境变量添加到了Dockerfile中。 - Chris Ritchie
@JanGaraj 我已更新问题,包括我用于启动容器的命令。我想这就是你所要求的吧? - Chris Ritchie
我会使用docker-compose的__links__选项来完成这个任务,然后连接URL将是__jdbc:postgresql://postgres_service_name__。此外,docker-compose将创建默认网络。 - Konrad
好的,当我在寻找解决方案时,发现我的Keycloak容器无法连接到PostgreSQL容器,使用--name参数解决了问题。感谢您的帮助! - Lëmön
1个回答

2

我的建议是:不要仅因为主题/模块的原因创建自己的Docker镜像。使用官方的Keycloak镜像并将您的自定义文件作为卷挂载 > 这样您将更容易地更新镜像。官方镜像还提供了DB配置环境变量,因此您无需使用自定义配置文件:

docker run -d \
  --name keycloak \
  --net my-net \
  -p 8080:8080 \
  -p 443:8443 \
  -v $PWD/themes/mytheme:/opt/jboss/keycloak/themes/healthjoiner \
  -v $PWD/modules:/opt/jboss/keycloak/modules/system/layers/keycloak \
  -e DB_VENDOR=postgres \
  -e DB_ADDR=postgresql \
  -e DB_PORT=5432 \
  -e DB_DATABASE=<DB> \
  -e DB_USER=<DBUSER> \
  -e DB_PASSWORD=<DBPASSWORD> \
  jboss/keycloak:4.7.0.Final

请参阅文档:https://hub.docker.com/r/jboss/keycloak 无论如何,在您的情况下,连接URL为(仅使用容器名称):
jdbc:postgresql://keycloak:5432/<DATABASE>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接