【问题标题】:Docker networking - Keycloak can not connect to postgresql running in separate docker instanceDocker 网络 - Keycloak 无法连接到在单独的 docker 实例中运行的 postgresql
【发布时间】:2018-12-20 06:19:03
【问题描述】:

我有两个 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 的容器内部可用。

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

更新

Postgres 是从以下内容开始的:

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

和钥匙斗篷:

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

【问题讨论】:

  • 您是如何启动容器的?我想查看您的容器的网络和名称配置。
  • 连接postgres需要修改xml文件吗?你能按照官方的 docker-compose 例子github.com/jboss-dockerfiles/keycloak/blob/master/… 吗?
  • @RyanDawson 我也尝试过,但没有成功,但是我现在没有使用 docker compose。我在 Dockerfile 中添加了这些 db 值作为 ENV 属性
  • @JanGaraj 我已经更新了问题以包含我用来启动容器的命令。我想这就是你要的?
  • 我会使用带有 links 选项的 docker-compose,然后连接 URL 将是 jdbc:postgresql://postgres_service_name 。 docker-compose 也会创建默认网络。

标签: postgresql docker keycloak


【解决方案1】:

我的建议:不要仅为主题/模块创建自己的 Docker 映像。使用官方 Keycloak 映像并将您的自定义文件挂载为卷 => 您将更轻松地更新映像。官方镜像还提供了 DB config env 变量,因此您无需使用自定义配置文件:

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>

【讨论】:

    猜你喜欢
    • 2017-09-16
    • 1970-01-01
    • 2022-01-25
    • 2017-07-25
    • 1970-01-01
    • 2022-10-13
    • 2017-03-16
    • 2019-08-28
    • 2023-03-28
    相关资源
    最近更新 更多