# docker-keycloak-image

基于搜索结果和我的了解，我来详细对比 Bitnami Keycloak 镜像与官方 Keycloak 镜像的区别：

### 主要区别对比

#### 1. **基础系统**

**官方镜像 (quay.io/keycloak/keycloak)**

* 基于 Red Hat UBI (Universal Base Image)
* 精简的基础系统
* 最小化的运行时环境

**Bitnami 镜像 (bitnami/keycloak)**

* 基于 Debian Linux
* 包含更多系统工具和依赖
* 更完整的 Linux 发行版环境

#### 2. **镜像大小**

```bash
# 官方镜像 - https://hub.docker.com/r/keycloak/keycloak
quay.io/keycloak/keycloak:26.2.5-0    # 约 400-500MB

# Bitnami 镜像 - https://hub.docker.com/r/bitnami/keycloak
bitnami/keycloak:26.2.5-debian-12-r0  # 约 600-800MB
```

#### 3. **环境变量配置**

**官方镜像**

```yaml
environment:
  KC_BOOTSTRAP_ADMIN_USERNAME: admin
  KC_BOOTSTRAP_ADMIN_PASSWORD: admin
  KC_DB: mysql
  KC_DB_URL: jdbc:mysql://mysql:3306/keycloak
  KC_DB_USERNAME: root
  KC_DB_PASSWORD: password
  KC_HOSTNAME_STRICT: "false"
  KC_HTTP_ENABLED: "true"
```

**Bitnami 镜像**

```yaml
environment:
  KEYCLOAK_ADMIN_USER: admin
  KEYCLOAK_ADMIN_PASSWORD: admin
  KEYCLOAK_DATABASE_VENDOR: mysql
  KEYCLOAK_DATABASE_HOST: mysql
  KEYCLOAK_DATABASE_PORT: 3306
  KEYCLOAK_DATABASE_NAME: keycloak
  KEYCLOAK_DATABASE_USER: root
  KEYCLOAK_DATABASE_PASSWORD: password
```

#### 4. **启动方式差异**

**官方镜像**

```yaml
command:
  - start-dev
  - --hostname-strict=false
  - --http-enabled=true
```

**Bitnami 镜像**

```yaml
# 通常不需要额外的启动命令
# 通过环境变量即可完成配置
```

#### 5. **集群支持**

**官方镜像**

* 需要手动配置集群参数
* 使用 KC\_CACHE\_STACK 等参数

**Bitnami 镜像**

* 支持配置高可用集群，通过设置服务发现机制和缓存设置来实现
* 提供更简化的集群配置选项

```yaml
# Bitnami 集群配置示例
environment:
  KEYCLOAK_JGROUPS_DISCOVERY_PROTOCOL: JDBC_PING
  KEYCLOAK_CACHE_OWNERS_COUNT: 1
  KEYCLOAK_CACHE_OWNERS_AUTH_SESSIONS_COUNT: 1
```

#### 6. **版本发布策略**

**官方镜像**

* 直接跟随 Keycloak 官方发布
* 版本号与 Keycloak 版本完全一致
* 发布频率更高

**Bitnami 镜像**

* 在官方版本基础上进行额外打包
* 版本号格式：`{keycloak_version}-debian-{debian_version}-r{revision}`
* 发布可能略有延迟

#### 7. **安全性考虑**

**官方镜像**

* 最小化攻击面
* 定期安全更新
* Red Hat 安全团队维护

**Bitnami 镜像**

* 有报告显示 Bitnami 镜像可能包含更多漏洞
* 基于 Debian 的更大攻击面
* Bitnami 团队维护安全更新

### 实际配置对比

#### Docker Compose - 官方镜像

```yaml
version: '3.8'
services:
  keycloak:
    image: quay.io/keycloak/keycloak:26.2.5-0
    environment:
      KC_BOOTSTRAP_ADMIN_USERNAME: admin
      KC_BOOTSTRAP_ADMIN_PASSWORD: admin
      KC_DB: mysql
      KC_DB_URL: jdbc:mysql://mysql:3306/keycloak
      KC_DB_USERNAME: root
      KC_DB_PASSWORD: password
      KC_HOSTNAME_STRICT: "false"
      KC_HTTP_ENABLED: "true"
    command:
      - start-dev
    ports:
      - "8080:8080"
```

#### Docker Compose - Bitnami 镜像

```yaml
version: '3.8'
services:
  keycloak:
    image: bitnami/keycloak:26.2.5-debian-12-r0
    environment:
      KEYCLOAK_ADMIN_USER: admin
      KEYCLOAK_ADMIN_PASSWORD: admin
      KEYCLOAK_DATABASE_VENDOR: mysql
      KEYCLOAK_DATABASE_HOST: mysql
      KEYCLOAK_DATABASE_PORT: 3306
      KEYCLOAK_DATABASE_NAME: keycloak
      KEYCLOAK_DATABASE_USER: root
      KEYCLOAK_DATABASE_PASSWORD: password
      KEYCLOAK_ENABLE_STATISTICS: "true"
      KEYCLOAK_ENABLE_HEALTH_ENDPOINTS: "true"
    ports:
      - "8080:8080"
```

### 选择建议

#### 选择**官方镜像**的情况：

* 追求最小化镜像大小
* 需要最新版本支持
* 对安全性要求极高
* 团队熟悉官方配置方式
* 生产环境部署

#### 选择**Bitnami 镜像**的情况：

* 需要简化的配置方式
* 需要额外的系统工具
* 希望开箱即用的集群支持
* 需要更多的运维友好特性
* 开发和测试环境

### 迁移注意事项

如果从 Bitnami 迁移到官方镜像：

1. **环境变量映射**

```bash
# Bitnami → 官方
KEYCLOAK_ADMIN_USER → KC_BOOTSTRAP_ADMIN_USERNAME
KEYCLOAK_DATABASE_VENDOR → KC_DB
KEYCLOAK_DATABASE_HOST → KC_DB_URL (需要组装完整URL)
```

2. **启动命令调整**

* 官方镜像需要显式指定启动模式
* 可能需要额外的命令行参数

3. **数据兼容性**

* 数据库结构完全兼容
* 配置数据可以直接迁移

**总结**：官方镜像更适合生产环境和追求最小化的场景，而 Bitnami 镜像提供了更友好的开发体验和简化的配置选项。


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://tuonioooo-notebook.gitbook.io/docker/advanced/docker-keycloak-image.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
