Dockerで複数バージョンのKeycloakを開発する
こんにちは、Keycloak大好きエンジニアのやまだゆうです。
今回は異なるバージョンのKeycloakで開発するためのdocker-composeファイルを紹介します。
この記事で紹介するプログラムはぼくのGithubで公開しています。ぜひクローンしてみてください。
この記事の内容
スポンサーリンク
きっかけ
業務で本番環境ごとに異なる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との違いはimage
とcontainer_name
だけです。起動してログインしてadminユーザーのIDを確認すると、バージョン21のときと同じca308538-3e05-456c-b788-f46fc2c25e4d
であることが確認できます。
これでデータを共有した複数バージョンのKeycloakの開発環境が完成しました!
スポンサーリンク
参考資料
使用したDockerイメージ
yamaday0uを応援お願いします!あなたの1クリックが励みになります。
>> にほんブログ村