9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

フューチャーAdvent Calendar 2019

Day 16

Keycloak Docker版をローカルのPostgreSQLにつなぐ

Last updated at Posted at 2020-03-02

フューチャー Advent Calendar 2019 16日目の記事です。
去年のアドカレを3月に投稿することになってしまい申し訳ありません。

Keycloakのカスタマイズ

OpenID Connectを利用した認証認可ソフトウェアの一つとして便利なKeycloakですが、ローカル環境で軽く試す場合、Javaのランタイムなど考えると少し面倒なのでDocker版を利用するケースが多いかと思います。
KeycloakのDBはデフォルトでIn-memoryのH2を使ってるので、Keycloakを再起動すると永続化された既存の設定が消えてしまい、再設定する手間がかかります。
例えば、あらゆる設定を試したり、SPIを利用したり、特にCredentialModel拡張やUserStorageSPIを使ってローカル環境でゴリゴリカスタマイズする場合、頻繁に再起動することになるので、ローカルのDBを使い永続化して内容を確認したり直接いじってみたりとかしたいですよね。

Docker版のDB永続化

Docker Hubにも書いてある通り、Docker版でももちろん外部のDBが使えるようにサポートしてますし、keycloak/keycloak-containersを見るとサンプルのDockerfileまで用意されてます。
しかし、このサンプルではdocker volumeで永続化された、Docker版DBをdocker-composeにより使ってるので、ここではローカルで直接インストールされたPostgreSQLにつなごうと思います。

Dockerfile

Dockerfile
FROM jboss/keycloak

ENV KEYCLOAK_USER admin
ENV KEYCLOAK_PASSWORD pass1234

ENV DB_VENDOR postgres
ENV DB_ADDR postgres
ENV DB_PORT 5432
ENV DB_DATABASE keycloak
ENV DB_USER keycloak-user
ENV DB_PASSWORD db-password

# ローカルで開発SPIのjarを入れる
ADD ./build/libs/*.jar /opt/jboss/keycloak/standalone/deployments/

ここで重要なのはENV DB_ADDR postgres
これをlocalhostにしてしまうと、DBの向き先がホストOS(ローカル)じゃなくコンテナ内を指してしまうので全然繋がりません。ここはpostgresというエイリアスにしときます。
(--net=hostでコンテナをホストネットワークにつなぐと、[UDP] /172.17.0.1 is not a valid address on any local network interfaceとかでWildFlyに怒られます。)

PostgreSQL

postgresql.conf
listen_addresses = '*'

コンテナからはホストの内部IPアドレスでアクセスして来ますが、ローカル環境なので特に支障なければ適当に*にします。

pg_hba.conf
# TYPE  DATABASE    USER             ADDRESS           METHOD
host    keycloak    keycloak-user    192.168.0.0/16    password

Dockerコンテナの中からホストにアクセスする場合は、Remote(接続元)のIPアドレスがdocker0によって変換されるので172.17.0.0/16などではなく、ホストの内部IPのCIDRである192.168.0.0/16 or 192.168.x.x/32などにします。
同じく支障なければ0.0.0.0/0でも構いません。

起動

$ docker run -p 8080:8080 --add-host postgres:`ipconfig getifaddr en0` keycloak

あとは起動時postgresエイリアスにホストマシンの内部IPをセットすればOKです。

やってみたら

これ、別にKeycloakに限った話じゃないですよね…
他のDocker版アプリをローカルDBにつなぐ場合にも使えそうです!

References

9
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?