本記事で行うこと
Keycloakの起動には開発モードと本番モードの2種類があります。
前回書いた記事では開発モードで起動しましたが、本記事では本番モードで起動してみます。
ただしサーバーやクラウドにはデプロイしません。
ローカル環境でDockerを使用し、httpsとhttpの両方を試します。
開発モードでの起動
bin/kc.[sh|bat] start-dev
本番モードでの起動
bin/kc.[sh|bat] start
Dockerコンテナ
Dockerコンテナはデータベース用とKeycloak用の2種類を用意しました。
後日Keycloak側をクラウドにデプロイするつもりなので、Docker Composeを使わないことにします。
データベースのコンテナ
本記事ではPostgreSQLを使用しました。
Dockerfile
FROM postgres
ENV POSTGRES_DB keycloak
ENV POSTGRES_USER keycloak
ENV POSTGRES_PASSWORD secret
EXPOSE 5432
docker build
docker build ./ -t mygres
docker run
docker run -p 5432:5432 -v /home/user/mydata:/var/lib/postgresql/data mygres
Keycloakコンテナ
httpsで動かすKeycloakコンテナ(オレオレ証明書使用)
Dockerfile
公式サイトのDockerfileを利用しましたが、そのままではうまく動かなかったので、少し変更しました。
FROM quay.io/keycloak/keycloak:latest as builder
# Enable health and metrics support
ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true
# Configure a database vendor
ENV KC_DB=postgres
WORKDIR /opt/keycloak
# for demonstration purposes only, please make sure to use proper certificates in production instead
RUN keytool -genkeypair -storepass password -storetype PKCS12 -keyalg RSA -keysize 2048 -dname "CN=server" -alias server -ext "SAN:c=DNS:localhost,IP:127.0.0.1" -keystore conf/server.keystore
RUN /opt/keycloak/bin/kc.sh build
FROM quay.io/keycloak/keycloak:latest
COPY --from=builder /opt/keycloak/ /opt/keycloak/
# Enable health and metrics support
ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true
# change these values to point to a running postgres instance
ENV KC_DB=postgres
ENV KC_DB_URL=jdbc:postgresql://host.docker.internal:5432/keycloak
ENV KC_DB_USERNAME=keycloak
ENV KC_DB_PASSWORD=secret
ENV KC_HOSTNAME=localhost
EXPOSE 8443
ENTRYPOINT ["/opt/keycloak/bin/kc.sh", "start"]
docker build
docker build ./ -t mycloak
docker run
- 初回
環境変数KEYCLOAK_ADMIN(管理ユーザー名)とKEYCLOAK_ADMIN_PASSWORD(管理ユーザーパスワード)を指定しています。
docker run --add-host=host.docker.internal:host-gateway -p 8443:8443 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin mycloak
- 2回目以降
2回目以降のdocker runで、KEYCLOAK_ADMINを指定すると動かなくなることがありましたので、外しました。
docker run --add-host=host.docker.internal:host-gateway -p 8443:8443 mycloak
httpで動かすKeycloakコンテナ
Dockerfile
FROM quay.io/keycloak/keycloak:latest as builder
# Enable health and metrics support
ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true
# Configure a database vendor
ENV KC_DB=postgres
WORKDIR /opt/keycloak
RUN /opt/keycloak/bin/kc.sh build
FROM quay.io/keycloak/keycloak:latest
COPY --from=builder /opt/keycloak/ /opt/keycloak/
# change these values to point to a running postgres instance
ENV KC_DB=postgres
ENV KC_DB_URL=jdbc:postgresql://host.docker.internal:5432/keycloak
ENV KC_DB_USERNAME=keycloak
ENV KC_DB_PASSWORD=secret
ENV KC_HOSTNAME=localhost
EXPOSE 8080
ENV KC_HTTP_PORT=8080
ENV KC_HTTP_ENABLED=true
ENV KC_HOSTNAME_STRICT=false
ENV KC_HOSTNAME_STRICT_HTTPS=false
ENTRYPOINT ["/opt/keycloak/bin/kc.sh", "start"]
docker build
docker build ./ -t mycloak_http
docker run
httpsバージョンとの違い
- PORTが8080
docker run --add-host=host.docker.internal:host-gateway -p 8080:8080 -e KEYCLOAK_ADMIN=admin -e KEYCLOAK_ADMIN_PASSWORD=admin mycloak_http
動作確認
httpsで動かす
ブラウザで https://localhost:8443 にアクセスします。
オレオレ証明書を使用しているので、以下のように警告が出ます。
「詳細設定」ボタンをクリックします。
「localhost にアクセスする」をクリックします。
「Administration Console」をクリックします。
Sign Inします。
Sign Inできました。以降は通常通り使えました。
httpで動かす
ブラウザで http://localhost:8080 にアクセスします。
httpsバージョンのようにオレオレ証明書に対する警告が出ず、通常通り動きました。
おまけ
試しにKeycloakをCloud Runにデプロイしてみました。
まだ本番では使えない中途半端な状態ですが、一応動いたので、Dockerfileを載せておきます
(何らかの方法で、環境変数KEYCLOAK_ADMINとKEYCLOAK_ADMIN_PASSWORDを設定する必要があります)。
FROM quay.io/keycloak/keycloak:18.0 as builder
# Enable health and metrics support
ENV KC_HEALTH_ENABLED=true
ENV KC_METRICS_ENABLED=true
WORKDIR /opt/keycloak
RUN /opt/keycloak/bin/kc.sh build
FROM quay.io/keycloak/keycloak:18.0
LABEL version="0.1"
LABEL maintainer="***.*** <****@****.com>"
COPY --from=builder /opt/keycloak/ /opt/keycloak/
ENV KC_HTTP_ENABLED=true
ENV KC_HOSTNAME_STRICT=false
ENV KC_HOSTNAME_STRICT_HTTPS=false
ENV KC_HOSTNAME_URL=http://localhost:8080
ENV KC_PROXY=edge
ENTRYPOINT ["/opt/keycloak/bin/kc.sh", "start"]