ข้ามไปยังเนื้อหา

รัน Keycloak ด้วย Docker

วิธีที่เร็วที่สุดในการรัน Keycloak บนเครื่องคือผ่าน Docker image ทางการบน quay.io มีทุกอย่างที่คุณต้องการ ไม่ต้องติดตั้ง database แยกต่างหาก คำสั่งเดียว Keycloak ก็พร้อมที่ port 8080

แต่ละส่วนของคำสั่ง docker run ทำงานดังนี้:

  1. docker run --name keycloak — ตั้งชื่อ container เพื่อให้อ้างอิงได้ในภายหลังด้วย docker stop keycloak หรือ docker rm keycloak
  2. -p 8080:8080 — map port 8080 บน host ไปยัง port 8080 ใน container ทำให้ http://localhost:8080 เชื่อมต่อถึง Keycloak ได้
  3. -e KC_BOOTSTRAP_ADMIN_USERNAME=admin — กำหนด admin username เริ่มต้น environment variable นี้ใช้เฉพาะตอน boot ครั้งแรกที่ยังไม่มี admin account
  4. -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin — กำหนด admin password เริ่มต้น ควรเปลี่ยนในทุก environment จริง อย่าปล่อยเป็น admin นอกจาก local dev
  5. quay.io/keycloak/keycloak:latest — official Keycloak image จาก Red Hat Quay registry ควร pin version เฉพาะเจาะจง (เช่น 26.0) ใน CI หรือ staging
  6. start-dev — เริ่ม Keycloak ใน development mode พร้อม embedded H2 in-memory database และเปิด HTTP โดยไม่ต้องใช้ TLS certificate
docker run --name keycloak -p 8080:8080 \
  -e KC_BOOTSTRAP_ADMIN_USERNAME=admin \
  -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin \
  quay.io/keycloak/keycloak:latest start-dev
  1. รอจนกว่า log จะแสดงบรรทัด Keycloak X.Y.Z on JVM (powered by Quarkus) started — นั่นหมายความว่า Keycloak พร้อมใช้งานแล้ว
  2. เปิด http://localhost:8080 ใน browser
  3. คลิก “Administration Console”
  4. Sign in ด้วย username admin และ password admin
  5. ตอนนี้คุณอยู่ใน admin console ของ master realm แล้ว

admin console (http://localhost:8080) คือ management UI สำหรับผู้ดูแลระบบ คุณสร้าง realm, client, user, role และ identity provider ที่นี่ เฉพาะสมาชิกในทีมที่ต้องการ configure Keycloak เท่านั้นที่ควรมีสิทธิ์เข้าถึง

account console (http://localhost:8080/realms/master/account) คือ self-service portal สำหรับผู้ใช้ทั่วไป ผู้ใช้สามารถอัปเดต profile, เปลี่ยน password และจัดการ session ที่ active อยู่ได้ที่นี่ ผู้ใช้แอปพลิเคชันของคุณจะมาที่นี่ ไม่ใช่ admin console แต่ละ realm มี account console ของตัวเองที่ /realms/{realm-name}/account

Terminal window
# Stop the container
docker stop keycloak
# Remove the container (data is lost — this is dev mode)
docker rm keycloak

เนื่องจาก start-dev ใช้ in-memory H2 database realm, client และ user ทั้งหมดที่คุณสร้างจะหายไปเมื่อลบ container ใน module ถัดไปคุณจะได้เรียนรู้วิธี persist ข้อมูลด้วย external database

ตัวเลือกBenefitCost
start-dev ใน Docker containerเริ่มใช้งานได้ในคำสั่งเดียว ไม่ต้องตั้งค่า database, เหมาะกับการทดลองและเรียนรู้ข้อมูลหายทุกครั้งที่ container ถูกลบ, ไม่มี TLS, ไม่เหมาะกับ workload จริงแม้แต่ staging ที่ต้องการความเสถียร
start พร้อม external database (production mode)ข้อมูล persist ผ่าน restart/redeploy, รองรับ TLS และ hostname ที่แน่นอน, scale ได้หลาย instanceต้องตั้งค่า database, TLS certificate และ reverse proxy เพิ่มเติมก่อนใช้งานได้
  • รัน start-dev แล้วลืมสลับเป็น start ก่อนขึ้น productionstart-dev ปิด security check หลายตัวและใช้ in-memory database ถ้าหลงลืมสลับโหมด ข้อมูล production จะหายทันทีที่ container restart
  • ไม่เปลี่ยน KC_BOOTSTRAP_ADMIN_USERNAME/KC_BOOTSTRAP_ADMIN_PASSWORD จากค่า default — การปล่อย admin/admin ไว้แม้ใน container ที่ expose port ออกสู่ network อื่นเป็นช่องโหว่ด้าน security ที่พบบ่อยมาก
  • ไม่ pin version ของ image — การใช้ quay.io/keycloak/keycloak:latest ใน CI หรือ staging ทำให้ behaviour เปลี่ยนแบบไม่คาดคิดเมื่อ Red Hat release version ใหม่ ควร pin เป็น version เจาะจงเสมอ

💡 ตัวอย่างจากของจริง

ทีม platform engineering ในองค์กร — มักใช้ docker run start-dev หรือ docker-compose เฉพาะบนเครื่อง local ของ developer สำหรับทดสอบ integration แล้วค่อย deploy Keycloak จริงผ่าน Helm chart บน Kubernetes พร้อม external PostgreSQL

Red Hat build of Keycloak (RH-SSO) — image ที่ใช้ในบทเรียนนี้มาจาก community build; องค์กรที่ต้องการ support สัญญา SLA จะใช้ container image ของ Red Hat build of Keycloak แทน แต่คำสั่ง start/start-dev และ environment variable ทำงานเหมือนกัน

flag -p 8080:8080 ในคำสั่ง docker run ทำอะไร?
start-dev ใช้ database อะไร?
ความแตกต่างระหว่าง admin console กับ account console คืออะไร?
จะเกิดอะไรกับข้อมูลเมื่อคุณ docker rm Keycloak container ใน start-dev mode?