DockerとPostgreSQLでkeycloakを設定する


このブログ記事では、Dockerコンテナ内で実行される専用のPostgreSQLデータベースを使用して、dockerの中でkeycloakを実行する方法を学びます.
このセットアップはほとんど開発環境で使用されるように設計されていますが、マイクロサービスアーキテクチャを使用した生産環境の良い出発点です.
この設定を自分のマシンで使用するにはDockerとDockerの設定が必要です.あなたの好きなOS上でDockerをインストールする方法についてチュートリアルを持っているドキュメントをチェックしてくださいhttps://docs.docker.com/get-docker/ .
PostgreSQLデータベースを設定して、すぐに起動しましょう.

DockerでセットアップPostgreSQL
我々の設定では、PostgreSQLをKeyCloakのデータベースとして使用して、ユーザー、クライアント、またはrealmのようなデータを保持し、デフォルトで提供されているH 2データベースを置き換えます.
Dockerハブで提供される公式PostgreSQLイメージを使用して、PostgreSQLインスタンスをDockerコンテナに実行します.
Dockerの構成を使い、dockerのインスタンスをdockerで定義することで、マルチコンテナの設定を緩和します.YMLファイル.
version: "3.9"
services:
  postgres:
    container_name: postgres_blog
    image: "postgres:13.2"
    volumes:
      - ./db-data:/var/lib/postgresql/data/
      - ./sql:/docker-entrypoint-initdb.d/:ro
    env_file:
      - ./database.dev.env
    networks:
      - backend
    ports:
      - "5432:5432"
  pgadmin:
    container_name: pgadmin_blog
    image: "dpage/pgadmin4:5.1"
    env_file:
      - ./database.dev.env
    ports:
      - "5050:80"
    networks:
      - backend
ここでいくつかのことが起こっている.一つずつ説明しましょう.
最初にデータをコンテナにマウントし、ホストにデータを保持するためにボリュームを定義します.
ここでは、ソースとターゲットパスの両方を提供します.このタイプのボリュームは、dev環境では良いですが、コンテナに直接名前付きボリュームやコピーファイルを使用することは、ファイルシステムの完全な制御を必要とする場合を除いて、生産環境に対してより助言され、Dockerの外部で変更を適用する場合を除きます.
最初のバインドマウントはコンテナが停止してもデータを保持するために使用されます.つ目のファイルは、KeyCloakとアプリケーションデータベースを初期化するためにファイルをマウントします.
最初の2つのスクリプトは、アプリケーション関連のデータをKeyCloakと同じデータベースに格納する場合にのみ必要です.
#!/bin/bash

psql -U dev -tc "SELECT 1 FROM pg_database WHERE datname = 'app'" \
| grep -q 1 || psql -U dev -c "CREATE DATABASE app"
MySQLライクなデータベースとは異なり、PostgreSQLは存在する場合はCREATEデータベースを持っていません.
回避策として、bashスクリプトを使用して存在しない場合はデータベースを作成するpsqlコマンドを実行します.ここで、ダブルパイプは、grepコマンドが成功しない場合にのみ、create database psqlコマンドが実行されることを意味します.
\c app;

DROP TABLE IF EXISTS Member;

CREATE TABLE Member (
    id VARCHAR(50) NOT NULL PRIMARY KEY,
    username VARCHAR(50) NOT NULL,
    email VARCHAR(50) NOT NULL,
    createdAt TIMESTAMP DEFAULT NOW()
);

DROP TABLE IF EXISTS Post;

CREATE TABLE Post (
    id SERIAL NOT NULL PRIMARY KEY,
    title VARCHAR(50) NOT NULL,
    scientificName VARCHAR(50) NOT NULL,
    family VARCHAR(32) NOT NULL,
    rating NUMERIC(3,2) DEFAULT 0.5,
    authorId VARCHAR(50),
    createdAt TIMESTAMP DEFAULT NOW(),
    CONSTRAINT fk_member FOREIGN KEY(authorId) REFERENCES Member(id)
    ON DELETE SET NULL ON UPDATE CASCADE
);
番目のスクリプトはもっと簡単です.単にアプリケーションデータベーススキーマを初期化します.
#!/bin/bash

psql -U dev -tc "SELECT 1 FROM pg_database WHERE datname = 'keycloak'" \
| grep -q 1 || psql -U dev -c "CREATE DATABASE keycloak"

psql -U dev -c "CREATE USER keycloak WITH PASSWORD 'kc'"
最後に、アプリケーションデータベースと同様にKeyCloakデータベースを作成します.
また、KeyCloakを使用してデータベースへのアクセスを取得する新しいユーザーを作成します.それは特別な使用のために専用のユーザーを定義するのに良いセキュリティ慣行で、デフォルトスーパーユーザを使用しません.
.Envファイルは、デフォルトで作成するユーザーを示すためにDockerハブページに記載されている環境変数を定義するために使用されます.
POSTGRES_USER="dev"
POSTGRES_PASSWORD="pwd"
さらに、pgadminサービスを定義します.これは、使いやすいユーザーインターフェイスを提供し、コマンドラインを使用してデータベースをクエリに直接コンテナを入力を防ぎます.
UIにアクセスするための既定のログインを定義するには、2つの新しい環境変数を追加する必要があります.
POSTGRES_USER="dev"
POSTGRES_PASSWORD="pwd"
PGADMIN_DEFAULT_EMAIL="[email protected]"
PGADMIN_DEFAULT_PASSWORD="admin"

Dockerでkeycloackを設定する
KeyCloakはRed Hatによって開発されたオープンソースのアイデンティティと管理ソリューションです.これは、SaaS製品などのSaaS製品やFireBaseやAWSの認知などのクラウドサービスの堅牢な代替であり、ほぼすべての認証や認証のニーズを満たすでしょう.あなたがまだデフォルト実装でカバーされない特定のニーズを持っているならば、KeyCloakはあなた自身のカスタムプロバイダーを接続するために多くのサービスプロバイダーインターフェースを提供します.
KeyCloakについてもっと知りたいなら、公式ドキュメンテーションをチェックしてくださいhttps://www.keycloak.org/
最初のステップはKeyCloakサービスを追加することによって私たちのDockerの作成ファイルを完了することです
version: "3.9"
services:
  postgres:
    container_name: postgres_blog
    image: "postgres:13.2"
    env_file:
      - ./database.dev.env
    networks:
      - backend
    volumes:
      - ./db-data:/var/lib/postgresql/data/
      - ./sql:/docker-entrypoint-initdb.d/:ro
    ports:
      - "127.0.0.1:5432:5432"
  pgadmin:
    container_name: pgadmin_blog
    image: "dpage/pgadmin4:5.1"
    env_file:
      - ./database.dev.env
    ports:
      - "127.0.0.1:5050:80"
    networks:
      - backend
  keycloak:
    container_name: keycloak_blog
    image: "jboss/keycloak:15.0.2"
    depends_on:
      - "postgres"
    env_file:
      - ./keycloak.dev.env
    ports:
      - "127.0.0.1:8180:8080"
      - "127.0.0.1:8787:8787" # debug port
    networks:
      - backend

networks:
  backend:
    name: backend
    driver: bridge
ここで新しいボリュームを定義する必要はありません.たとえば、IDEからリモートデバッガを接続したい場合は、ホストからKeyCloakにアクセスするために8080ポートをマップする必要があります.
PostgreSQLの設定と同様に、私たちはaを使います.Envファイルを必要な環境変数を設定します.
KEYCLOAK_USER=admin
KEYCLOAK_PASSWORD=password
DEBUG=true
DEBUG_PORT='*:8787'
DB_VENDOR=POSTGRES
DB_ADDR=postgres
DB_PORT=5432
DB_DATABASE=keycloak
DB_USER=keycloak
DB_PASSWORD=kc
TZ=Europe/Paris
すべての利用できる環境変数はKeyCloakイメージのDockerハブページにリストされますhttps://hub.docker.com/r/jboss/keycloak/ .
また、KeyCloakユーザーとデータベースを作成する新しいスクリプトも作成します.
すべてのコンテナが互いに通信できるように、同じネットワーク上のすべてのサービスを定義します.
ここでは、同じホストで通信が起こるだけでブリッジモードを使います.
最後に、KeyCloakサービスがPostgreSQLに依存しているか、KeyCloakコンテナの起動時にデータベース接続エラーが発生します.

すべてをまとめる
すべての必要な宣言を作成したので、セットアップを実行する時間です.
Dockerは、すべてのサービスをブートする単一のコマンドを使用して簡単に作成します
docker-compose up -d
起動が完了したら、すべてのコンテナが動作していることを確認できます
docker ps
現在、我々は、Docker構成でマップされたポートを通してKeyCloakバックオフィスにアクセスすることができます.YMLファイルと以前に定義されたログインを使用して.envファイル.

ログインしたら、ユーザー、クライアント、および他の多くのアクションを作成することによって我々の領域をカスタマイズすることができます.KeyCloakが提供するすべての機能を把握するため、公式KeyCloakドキュメントをチェックします.

また、pgadminを使ってPostgreSQLデータベースにアクセスすることもできます.

次に、PostgreSQLデータベースへの接続を設定する必要があります.

最後に、アプリケーションスキーマにアクセスできます.

すべての設定ファイルを含むリポジトリが利用できます.https://github.com/Mozenn/setup-keycloak-with-docker-and-postgresql

資源
  • オフィシャルドキュメンテーションhttps://www.keycloak.org/documentation
  • Docker keycloakイメージページhttps://hub.docker.com/r/jboss/keycloak/
  • Dockerネットワーク概要https://docs.docker.com/network/