

Keycloak 是企业级开源身份认证和访问控制解决方案,功能强大、支持多协议,并适合自建部署。本文将手把手教你如何基于 Docker 快速部署 Keycloak,涵盖 HTTP 模式、HTTPS 模式(自签证书)、以及结合 Nginx 的反向代理部署方案。每种模式都适用于不同的内网或生产环境场景,助你构建安全、稳定的身份认证系统。
Keycloak 是一款开源的身份与访问管理(IAM)解决方案,支持 OAuth 2.0、OpenID Connect、SAML 等标准协议。它具备如下核心能力:

适用于测试和开发,直接启用 HTTP 服务。
✅ 建议部署后尽快创建正式管理员账号,并删除初始的 KEYCLOAK_ADMIN 用户。
配置说明:
services:
  postgres:
    image: postgres:15-alpine
    container_name: keycloak_postgres
    environment:
      POSTGRES_DB: keycloak
      POSTGRES_USER: keycloak
      POSTGRES_PASSWORD: supersecret
    volumes:
      - keycloak-db:/var/lib/postgresql/data
  keycloak:
    image: quay.io/keycloak/keycloak:latest
    container_name: keycloak
    command: start
    environment:
      KC_DB: postgres
      KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
      KC_DB_USERNAME: keycloak
      KC_DB_PASSWORD: supersecret
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: admin
      KC_HOSTNAME_STRICT: false
      KC_HTTP_ENABLED: true
    ports:
      - "8080:8080"
    depends_on:
      - postgres
volumes:
  keycloak-db:访问地址:http://<your-ip>:8080
此方式下 Keycloak 自行监听 8443,并启用 TLS。
关键点:
    keycloak:
    image: quay.io/keycloak/keycloak:latest
    container_name: keycloak
    command: start
    environment:
      KC_DB: postgres
      KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
      KC_DB_USERNAME: keycloak
      KC_DB_PASSWORD: supersecret
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: admin
      KC_HTTPS_CERTIFICATE_FILE: /etc/certs/IP.cert.pem
      KC_HTTPS_CERTIFICATE_KEY_FILE: /etc/certs/IP.key.pem
      KC_HOSTNAME_STRICT: false
      KC_PROXY: edge 
    volumes:
      - /etc/certs:/etc/certs:ro
      - /etc/localtime:/etc/localtime
    depends_on:
      - postgres
    ports:
      - "8443:8443"Nginx 负责 TLS,Keycloak 后端使用 HTTP 通信,部署灵活、适合域名区分服务的场景。内网环境可以使用端口来却分服务。
关键配置:
services:
  postgres:
    image: postgres:15-alpine
    container_name: keycloak_postgres
    environment:
      POSTGRES_DB: keycloak
      POSTGRES_USER: keycloak
      POSTGRES_PASSWORD: supersecret
    volumes:
      - keycloak-db:/var/lib/postgresql/data
    networks:
      - keycloak-net
  keycloak:
    image: quay.io/keycloak/keycloak:latest
    container_name: keycloak
    command: start
    environment:
      KC_DB: postgres
      KC_DB_URL: jdbc:postgresql://postgres:5432/keycloak
      KC_DB_USERNAME: keycloak
      KC_DB_PASSWORD: supersecret
      KEYCLOAK_ADMIN: admin
      KEYCLOAK_ADMIN_PASSWORD: admin
      KC_HOSTNAME: Intranet_IP
      KC_HOSTNAME_PORT: Custom_Port
      KC_HOSTNAME_STRICT: true
      KC_HOSTNAME_STRICT_HTTPS: true
      KC_HTTP_ENABLED: true
      KC_PROXY: edge 
    volumes:
      - /etc/localtime:/etc/localtime
    expose:
      - 8080
    networks:
      - nginx-proxy-network
      - keycloak-net
volumes:
  keycloak-db:
networks:
  nginx-proxy-network:
    external: true
  keycloak-net:
    external: trueNginx 配置示例:
server {
    listen Custom_Port ssl;
    server_name Intranet_IP;
    ssl_certificate /etc/nginx/certs/IP.cert.pem;
    ssl_certificate_key /etc/nginx/certs/IP.key.pem;
    ssl_protocols TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers on;
    ssl_ciphers HIGH:!aNULL:!MD5;
    add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
    location / {
        proxy_pass http://keycloak:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_http_version 1.1;
        proxy_set_header Connection "";
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto https;
        proxy_set_header X-Forwarded-Host $host:$server_port;
    }
}🚫 删除默认管理用户(bootstrap admin)
✅ 使用 realm-management → realm-admin 角色创建正式管理员
🧠 优先使用 Nginx 模式,在多个服务和网段之间更灵活
🔐 为生产部署配置正式证书与强密码策略
更多内容持续更新于我的博客:https://www.zenseek.site
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。