yamaday0u Blog Written by yamaday0u

Dockerで複数バージョンのKeycloakを開発する

PROGRAMMER

こんにちは、Keycloak大好きエンジニアのやまだゆうです。

今回は異なるバージョンのKeycloakで開発するためのdocker-composeファイルを紹介します。

この記事で紹介するプログラムはぼくのGithubで公開しています。ぜひクローンしてみてください。

この記事の内容

  1. きっかけ
  2. リポジトリの構成
  3. データベースとネットワークを構築する
  4. Keycloakを起動する

スポンサーリンク

きっかけ

業務で本番環境ごとに異なるKeycloakのバージョンで運用していました。バージョンごとに動作が異なる部分を考慮しながら開発できるようにしたいと思い、1つのレポジトリで各バージョンに対応できるようにしようと思い立ったことがきっかけです。

この開発環境の構築のときに工夫したポイントが3つあります。

  • ローカルのファイルに依存しないよう名前付きボリュームを使う
  • 勉強のためにこれまで使ったことがないネットワーク機能を使う
  • 異なるバージョンのKeycloakを共通のデータで開発できるようにする

とくに3つ目の「共通のデータ」はこだわりがありました。バージョンを切り替えるごとに別々のデータを作っていたのでは開発の都合上、使い勝手が悪くなるからです。

リポジトリの構成

リポジトリの構成は以下のようになっています。

.
├── README.md
├── mysql
│   └── compose.yaml
├── v21
│   └── compose.yaml
└── v22
    └── compose.yaml

mysqlディレクトリのcompose.yamlは各バージョンのKeycloakが参照するための共通データベースです。

スポンサーリンク

データベースとネットワークを構築する

ボリュームを作成する

まずは、「ローカルのファイルに依存しないよう名前付きボリュームを使う」を実現するために名前付きボリュームを作成します。

docker volume create keycloak-mysql-data

docker volume lsコマンドでkeycloak-mysql-dataボリュームが作成されていることを確認しましょう。

ネットワークを作成する

次にネットワークを構築します。MySQLとKeycloakを異なるcompose.yamlから起動するため、同じネットワーク内に構築する目的があります。そのため、事前にネットワークを作成しておく必要があります。

docker network create keycloak-network

docker network lsコマンドでネットワークのリストにkeycloak-networkが作成されていることを確認しましょう。

データベース(MySQL)を起動する

ボリュームとネットワークの準備が整ったら、MySQLを起動します。MySQLのcompose.yamlは以下のように設定しています。

version: "3"

services:
  mysql:
    image: mysql:8.0.33
    container_name: keycloak-mysql
    volumes:
      - keycloak-mysql-data:/var/lib/mysql # ボリュームをコンテナ内にマウント
    environment:
      MYSQL_ROOT_PASSWORD: password
      MYSQL_DATABASE: keycloak
      MYSQL_USER: db-user
      MYSQL_PASSWORD: password
    ports:
      - 3306:3306

volumes:
  keycloak-mysql-data: # 先ほど作成したボリュームを指定
    external: true

networks:
  default:
    name: keycloak-network # 先ほど作成したネットワークを指定
    external: true

先ほど作成したボリュームとネットワークに接続するため、それぞれにexternal: trueを使います。

compose.yamlをもとにコンテナを起動します。

docker compose up
初回起動時はMySQLが接続可能な状態になるまで時間がかかるので、ログで状態を確認しましょう。2回目以降はdocker compose up -dコマンドでOKです。

Keycloakを起動する

つづいて、Keycloakのコンテナを起動しましょう。

バージョン21のKeycloakを起動する

バージョン21のKeycloakのcompose.yamlは以下のようになっています。

version: "3"

services:
  keycloak:
    image: keycloak/keycloak:21.1.0
    container_name: keycloak-v21
    ports:
      - 4000:8080
    environment:
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: password
      KC_HTTP_RELATIVE_PATH: /auth
      # DB設定
      KC_DB: mysql
      KC_DB_URL: jdbc:mysql://keycloak-mysql:3306/keycloak
      KC_DB_USERNAME: db-user
      KC_DB_PASSWORD: password
    command: start-dev

networks:
  default:
    name: keycloak-network # MySQLと同じネットワークを指定
    external: true

注目ポイントはKC_DB_URLの部分です。jbdc:mysql://コンテナ名:3306/keycloakとすることで、コンテナで起動したMySQLに接続することができます。

参考:All configuration – Keycloak

compose.yamlをもとにコンテナを起動します。

docker compose up

http://localhost:4000/authにアクセスして、admin・passwordでログインしましょう。

adminユーザーの情報を確認してみます。IDにca308538-3e05-456c-b788-f46fc2c25e4dが割り当てられています。

バージョン22のKeycloakを起動する

バージョン21のKeycloakコンテナをdocker compose downコマンドで終了して、今度はバージョン22のKeycloakコンテナを起動します。

version: "3"

services:
  keycloak:
    image: keycloak/keycloak:22.0.3
    container_name: keycloak-v22
    ports:
      - 4000:8080
    environment:
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: password
      KC_HTTP_RELATIVE_PATH: /auth
      # DB設定
      KC_DB: mysql
      KC_DB_URL: jdbc:mysql://keycloak-mysql:3306/keycloak
      KC_DB_USERNAME: db-user
      KC_DB_PASSWORD: password
    command: start-dev

networks:
  default:
    name: keycloak-network
    external: true

バージョン21との違いはimagecontainer_nameだけです。起動してログインしてadminユーザーのIDを確認すると、バージョン21のときと同じca308538-3e05-456c-b788-f46fc2c25e4dであることが確認できます。

これでデータを共有した複数バージョンのKeycloakの開発環境が完成しました!

スポンサーリンク

参考資料

使用したDockerイメージ

yamaday0uを応援お願いします!あなたの1クリックが励みになります。
>> にほんブログ村