KEEL · 龙骨 · A CURRICULUM FOR THE AI ERA

02 · 跑起第一个 IdP — keel 龙骨

上一章说的那个"专门做证明的角色"(IdP),这一章给它一个实物:Keycloak—— 一个开源的 IdP 软件。不用安装,一条 docker 命令就能跑起来。

上一章说的那个"专门做证明的角色"(IdP),这一章给它一个实物:Keycloak——
一个开源的 IdP 软件。不用安装,一条 docker 命令就能跑起来。

前置:这一章要求本机有一个能用的 Docker(docker version 里 Client 和 Server 两段都在,
才算装好且正在运行)。不会 Docker 也没关系——你只要照抄下面那一条命令;
想补基础,看《Docker 基础课》。

一、一条命令把它跑起来

docker run -d --name sso-kc \
  -p 8081:8080 \
  -e KC_BOOTSTRAP_ADMIN_USERNAME=admin \
  -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin \
  quay.io/keycloak/keycloak:26.8.1 start-dev

敲完会输出一长串十六进制字符,那是这个容器的编号:

8f3c1b2a9d4e5f6a7b8c9d0e1f2a3b4c5d6e7f8a9b0c1d2e3f4a5b6c7d8e9f0a

它不会立刻就能用——Keycloak 起得慢一点。等几秒,看它的日志:

docker logs sso-kc 2>&1 | grep "started in"

看到这一行,就说明它活了:

INFO  [io.quarkus] (main) Keycloak 26.8.1 on JVM (powered by Quarkus 3.40.1) started in 9.456s. Listening on: http://0.0.0.0:8080

数字每次不一样(9.456s 是这次启动花的时间),要读的是形状:
Keycloak <版本> + started in … + Listening on: http://0.0.0.0:8080
(日志每行前面还有一个时间戳,这里省掉了)。

再看一眼它公开的那份清单,确认地址真的通了:

curl -s http://localhost:8081/realms/master/.well-known/openid-configuration | head -c 200
{"issuer":"http://localhost:8081/realms/master",
 "authorization_endpoint":"http://localhost:8081/realms/master/protocol/openid-connect/auth",
 "token_endpoint":"http://localhost:8081/realms/master/protocol/openid-connect/token", ...

issuer 里是 localhost:8081——就是你刚才在 -p 里选的那个端口。
(master 是 Keycloak 自带的一个管理用 realm;第 3 章会建你自己的那个。)

二、这一行的每一段在做什么

把命令拆开看:

片段 它在做什么
docker run 从一个镜像启动一个容器
-d 后台运行,不占用你的终端
--name sso-kc 给容器起名叫 sso-kc,后面用它指代,不用记那串 id
-p 8081:8080 端口映射:冒号左边是你电脑的 8081,右边是容器里的 8080
-e KC_BOOTSTRAP_ADMIN_USERNAME=admin 往容器里传一个环境变量:第一次初始化时用的管理员用户名
-e KC_BOOTSTRAP_ADMIN_PASSWORD=admin 同上,密码。只在容器头一次启动、里面还没有账号时生效
quay.io/keycloak/keycloak:26.8.1 跑哪个镜像:Keycloak,标签 26.8.1(版本号)
start-dev 镜像启动后要执行的命令:以开发模式启动

-p 这一段最容易看错方向,和 Docker 里所有 -p 是同一种读法:

-p 8081:8080
    ↑     ↑
 你的电脑  容器里面

Keycloak 在容器里固定监听 8080,于是你在浏览器里要访问的是 localhost:8081。
用它:http://localhost:8081/admin/ 就是它的管理控制台登录页。

自检两条:docker version(Client / Server 两段都在)、
docker ps --filter name=sso-kc(应看到一行,PORTS 列是 0.0.0.0:8081->8080/tcp)。

重跑会报名字冲突:docker: Error response from daemon: Conflict. The container name "/sso-kc" is already in use by container "…". You have to remove (or rename) that container to be able to reuse that name.
这不是坏了。想从头再来一遍,先 docker rm -f sso-kc 把它删掉。

三、它不是什么

日志里那一行大写的话,请当真:

Running the server in development mode. DO NOT use this configuration in production.

读完你能做什么

下一步:IdP 起来了,但它现在还不知道"你的应用"是谁。
下一章把你的应用登记进去,然后亲眼走一遍"跳去登录、再跳回来"。

进入 keel 阅读