
ivanfranchin/keycloak-clusteredkeycloak-clustered 是基于 quay.io/keycloak/keycloak 官方 Docker 镜像的扩展版本,通过添加 JDBC_PING 集群发现协议,简化了 Keycloak 集群的部署和配置。该镜像旨在帮助用户快速构建支持分布式会话共享和高可用性的 Keycloak 集群环境,适用于开发测试和生产部署场景。
| 标签版本 | Dockerfile 链接 |
|---|---|
26.0.8, latest | Dockerfile |
26.0.7 | Dockerfile |
26.0.6 | Dockerfile |
26.0.5 | Dockerfile |
26.0.4 | Dockerfile |
26.0.2 | Dockerfile |
26.0.1 | Dockerfile |
26.0.0 | Dockerfile |
25.0.6 | Dockerfile |
25.0.5 | Dockerfile |
25.0.4 | Dockerfile |
25.0.2 | Dockerfile |
25.0.1 | Dockerfile |
25.0.0 | Dockerfile |
该镜像继承 Keycloak 官方镜像的所有环境变量,完整配置可参考 Keycloak 官方文档。常用基础变量包括:
| 环境变量 | 描述 | 默认值 |
|---|---|---|
KEYCLOAK_ADMIN | 管理员用户名 | - |
KEYCLOAK_ADMIN_PASSWORD | 管理员密码 | - |
KC_DB | 数据库类型(mysql/mariadb/postgres/mssql) | - |
KC_DB_URL_HOST | 数据库主机地址 | - |
KC_DB_URL_DATABASE | 数据库名称 | keycloak |
KC_DB_USERNAME | 数据库用户名 | - |
KC_DB_PASSWORD | 数据库密码 | - |
KC_LOG_LEVEL | 日志级别 | INFO |
| 环境变量 | 描述 | 示例值 |
|---|---|---|
JGROUPS_DISCOVERY_EXTERNAL_IP | 集群节点外部IP/主机名 | keycloak-clustered-1 |
进入对应版本目录,执行以下命令构建镜像:
bashdocker build -t ivanfranchin/keycloak-clustered:latest .
bashdocker network create keycloak-net
bashdocker run --rm --name mysql -p 3306:3306 \ -e MYSQL_DATABASE=keycloak \ -e MYSQL_USER=keycloak \ -e MYSQL_PASSWORD=password \ -e MYSQL_ROOT_PASSWORD=root_password \ --network keycloak-net \ mysql:9.1.0
bashdocker run --rm --name keycloak-clustered-1 -p 8080:8080 \ -e KEYCLOAK_ADMIN=admin \ -e KEYCLOAK_ADMIN_PASSWORD=admin \ -e KC_DB=mysql \ -e KC_DB_URL_HOST=mysql \ -e KC_DB_URL_DATABASE=keycloak \ -e KC_DB_USERNAME=keycloak \ -e KC_DB_PASSWORD=password \ -e KC_LOG_LEVEL=INFO,org.infinispan:DEBUG,org.jgroups:DEBUG \ -e JGROUPS_DISCOVERY_EXTERNAL_IP=keycloak-clustered-1 \ --network keycloak-net \ ivanfranchin/keycloak-clustered:latest start-dev
bashdocker run --rm --name keycloak-clustered-2 -p 8081:8080 \ -e KEYCLOAK_ADMIN=admin \ -e KEYCLOAK_ADMIN_PASSWORD=admin \ -e KC_DB=mysql \ -e KC_DB_URL_HOST=mysql \ -e KC_DB_URL_DATABASE=keycloak \ -e KC_DB_USERNAME=keycloak \ -e KC_DB_PASSWORD=password \ -e KC_LOG_LEVEL=INFO,org.infinispan:DEBUG,org.jgroups:DEBUG \ -e JGROUPS_DISCOVERY_EXTERNAL_IP=keycloak-clustered-2 \ --network keycloak-net \ ivanfranchin/keycloak-clustered:latest start-dev
bashdocker network create keycloak-net
bashdocker run --rm --name mariadb -p 3306:3306 \ -e MARIADB_DATABASE=keycloak \ -e MARIADB_USER=keycloak \ -e MARIADB_PASSWORD=password \ -e MARIADB_ROOT_PASSWORD=root_password \ --network keycloak-net \ mariadb:10.11.10
bashdocker run --rm --name keycloak-clustered-1 -p 8080:8080 \ -e KEYCLOAK_ADMIN=admin \ -e KEYCLOAK_ADMIN_PASSWORD=admin \ -e KC_DB=mariadb \ -e KC_DB_URL_HOST=mariadb \ -e KC_DB_URL_DATABASE=keycloak \ -e KC_DB_USERNAME=keycloak \ -e KC_DB_PASSWORD=password \ -e KC_LOG_LEVEL=INFO,org.infinispan:DEBUG,org.jgroups:DEBUG \ -e JGROUPS_DISCOVERY_EXTERNAL_IP=keycloak-clustered-1 \ --network keycloak-net \ ivanfranchin/keycloak-clustered:latest start-dev
bashdocker run --rm --name keycloak-clustered-2 -p 8081:8080 \ -e KEYCLOAK_ADMIN=admin \ -e KEYCLOAK_ADMIN_PASSWORD=admin \ -e KC_DB=mariadb \ -e KC_DB_URL_HOST=mariadb \ -e KC_DB_URL_DATABASE=keycloak \ -e KC_DB_USERNAME=keycloak \ -e KC_DB_PASSWORD=password \ -e KC_LOG_LEVEL=INFO,org.infinispan:DEBUG,org.jgroups:DEBUG \ -e JGROUPS_DISCOVERY_EXTERNAL_IP=keycloak-clustered-2 \ --network keycloak-net \ ivanfranchin/keycloak-clustered:latest start-dev
bashdocker network create keycloak-net
bashdocker run --rm --name postgres -p 5432:5432 \ -e POSTGRES_DB=keycloak \ -e POSTGRES_USER=keycloak \ -e POSTGRES_PASSWORD=password \ --network keycloak-net \ postgres:17.2
bashdocker run --rm --name keycloak-clustered-1 -p 8080:8080 \ -e KEYCLOAK_ADMIN=admin \ -e KEYCLOAK_ADMIN_PASSWORD=admin \ -e KC_DB=postgres \ -e KC_DB_URL_HOST=postgres \ -e KC_DB_URL_DATABASE=keycloak \ -e KC_DB_SCHEMA=myschema \ -e KC_DB_USERNAME=keycloak \ -e KC_DB_PASSWORD=password \ -e KC_LOG_LEVEL=INFO,org.infinispan:DEBUG,org.jgroups:DEBUG \ -e JGROUPS_DISCOVERY_EXTERNAL_IP=keycloak-clustered-1 \ --network keycloak-net \ ivanfranchin/keycloak-clustered:latest start-dev
bashdocker run --rm --name keycloak-clustered-2 -p 8081:8080 \ -e KEYCLOAK_ADMIN=admin \ -e KEYCLOAK_ADMIN_PASSWORD=admin \ -e KC_DB=postgres \ -e KC_DB_URL_HOST=postgres \ -e KC_DB_URL_DATABASE=keycloak \ -e KC_DB_SCHEMA=myschema \ -e KC_DB_USERNAME=keycloak \ -e KC_DB_PASSWORD=password \ -e KC_LOG_LEVEL=INFO,org.infinispan:DEBUG,org.jgroups:DEBUG \ -e JGROUPS_DISCOVERY_EXTERNAL_IP=keycloak-clustered-2 \ --network keycloak-net \ ivanfranchin/keycloak-clustered:latest start-dev
警告:当前该配置存在问题,暂不推荐使用。
http://localhost:8080 和 http://localhost:8081admin,密码:admin)admin 用户有 2 个会话以 MySQL 为例,进入数据库容器查看集群表:
bash# 进入 MySQL 终端 docker exec -it -e MYSQL_PWD=password mysql mysql -ukeycloak --database keycloak # 查看 JGROUPSPING 表(集群节点信息) mysql> SELECT * FROM JGROUPSPING;
Ctrl+CCtrl+\bashdocker network rm keycloak-net
Vagrantfile 配置数据库类型(可选)bashvagrant up
vagrant suspendvagrant upvagrant haltvagrant destroy -f自 Keycloak 26.1.0 版本起,集群发现默认传输栈已切换为 JDBC-PING,简化了集群配置并提升了云环境兼容性。有关集群部署的详细指南,可参考以下文章:
Ivan Franchin
探索更多轩辕镜像的使用方法,找到最适合您系统的配置方式
通过 Docker 登录认证访问私有仓库
无需登录使用专属域名
Kubernetes 集群配置 Containerd
K3s 轻量级 Kubernetes 镜像加速
VS Code Dev Containers 配置
Podman 容器引擎配置
HPC 科学计算容器配置
ghcr、Quay、nvcr 等镜像仓库
Harbor Proxy Repository 对接专属域名
Portainer Registries 加速拉取
Nexus3 Docker Proxy 内网缓存
需要其他帮助?请查看我们的 常见问题Docker 镜像访问常见问题解答 或 提交工单
manifest unknown 错误
TLS 证书验证失败
DNS 解析超时
410 错误:版本过低
402 错误:流量耗尽
身份认证失败错误
429 限流错误
凭证保存错误
来自真实用户的反馈,见证轩辕镜像的优质服务