# 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 镜像提供了更友好的开发体验和简化的配置选项。
