Docker/환경 구성
[Docker] Docker Compose를 이용한 Keycloak 환경 구성 및 실행 방법
adjh54
2025. 1. 18. 23:42
728x170
해당 글에서는 Docker Compose를 통해서 Keycloak을 구성하는 방법에 대해 알아봅니다.
💡[참고] 이전에 작성한 Docker 관련 글들을 읽으시면 도움이 됩니다.
분류 | 설명 | 링크 |
이해하기 | Docker 환경 설치 및 실행 방법 | https://adjh54.tistory.com/350 |
이해하기 | Docker 기초 이론(아키텍처, 흐름, 주요 용어) | https://adjh54.tistory.com/352 |
이해하기 | Docker 컨테이너 라이프 사이클 & CLI | https://adjh54.tistory.com/359 |
이해하기 | DockerFile 이론 + Nginx 환경 구성 및 배포 방법 | https://adjh54.tistory.com/414 |
이해하기 | Docker Compose 이해하고 구성 | https://adjh54.tistory.com/503 |
환경구성 | DockerFile + Vault 환경 구성 및 배포 방법 | https://adjh54.tistory.com/415 |
환경구성 | DockerFile + React 환경 구성 및 배포 방법 | https://adjh54.tistory.com/417 |
환경구성 | DockerFile + Spring Boot 환경 구성 및 배포 방법 | https://adjh54.tistory.com/420 |
환경구성 | DockerFile + Redis 환경 구성 및 배포 방법 | https://adjh54.tistory.com/449 |
환경구성 | DockerFile + RabbitMQ 환경 구성 및 실행 방법 | https://adjh54.tistory.com/496 |
환경구성 | Docker Compose + RabbitMQ 노드 클러스터링 방법 | https://adjh54.tistory.com/517 |
환경구성 | Docker Compose + Apache Kafka, Kafka-UI 환경 구성 방법 | https://adjh54.tistory.com/637 |
환경구성 | Docker Compose + Jenkins 환경 구성 및 실행방법 | https://adjh54.tistory.com/643 |
환경구성 | Docker Compose + Keycloak 환경 구성 및 실행방법 | https://adjh54.tistory.com/644 |
이해하기 | Keycloak 이해하기 -1 : 구성 요소, 인증 처리과정, 주요 기능 | https://adjh54.tistory.com/645 |
이해하기 | Keycloak 이해하기 -2 : SAML/OIDC 프로토콜, 인증 흐름(Authentication flow) 종류 | https://adjh54.tistory.com/646 |
이해하기 | Keycloak 이해하기 -3 : 기본 환경 구성 및 로그인/로그아웃 구현 | https://adjh54.tistory.com/647 |
이해하기 | Keycloak 이해하기 -4 : Keycloak 권한 및 종류 | https://adjh54.tistory.com/655 |
환경파일 | Dokcer Compose + Keycloak Dockerfile Repository | https://github.com/adjh54ir/multiflex-docker/tree/main/simple-docker-compose-keycloak |
1) KeyCloak
💡 Keycloak
- Red Hat에서 개발한 오픈소스 Identity and Access Management(IAM) 솔루션입니다. 현대적인 애플리케이션과 서비스를 위한 인증 및 권한 부여 기능을 제공하는 인증 서버(Authentication Server)입니다
- Keycloack에서는 여러 플랫폼에서 중앙 집중식 인증 서버로 동작을 합니다.
- 주요한 기능은 서로 다른 도메인에서 실행되는 애플리케이션 간의 SSO를 지원하거나 REST API 기반에 접근제어 토큰에 대한 인증 제공 및 세션 타임아웃, 동시 로그인 제한과 같은 다양한 세션 기능을 담당합니다.

2) Dockerfile
💡 도커 파일(Dockerfile)
- 도커 이미지를 만들고 빌드하기 위한 ‘텍스트 파일’을 의미합니다. 이는 컨테이너 이미지를 구성하는데 필요한 모든 단계와 명령을 정의합니다.
1. Dockerfile 수행과정
💡 Dockerfile 수행과정
1. Dockerfile
- 도커파일에서 일련의 명령을 작성하여 이미지를 빌드하는 방법을 지정합니다. 또한 이미지를 지정하고 필요한 패키지를 설치하고 파일을 복사하여 명령을 실행하는 등의 작업을 수행합니다.
2. Dockerfile → (Build) → Docker Image
- 도커 엔진이 도커 파일을 한 줄씩 읽어서 이미지를 빌드합니다 : Dockerfile Layer
3. Docker Image → (Run) → Docker Container
- 빌드된 이미지를 실행하여 도커 컨테이너를 구성합니다.

3) Docker Compose
💡 Docker Compose
- 여러 컨테이너가 함께 실행되는 환경에서, 하나의 파일 내에 정의하여 여러 컨테이너를 관리하기 위한 도구를 의미합니다. 즉, 여러 컨테이너를 관리할 때, 단일 명령어를 통해 생성-관리-배포하는 기능을 수행하는 역할을 합니다.
- 기존의 Dockerfile을 통해 단일 컨테이너를 ‘생성-관리-배포’하는 과정에서의 처리과정은 간단하였으나 여러 컨테이너를 일괄 띄우는데 시간 소요가 많이 되기에 이를 사용합니다.
- 이러한 컨테이너 관리는 YAML 파일 형식을 사용하여 서비스, 네트워크 및 볼륨 같은 애플리케이션 서비스를 구성할 수 있습니다. 또한 개발, 테스트, 스테이징, 운영 및 CI 워크플로우 환경에서 애플리케이션을 이동하여 배포가 가능하기에 관리가 매우 편리합니다.

1. Docker Compose 처리 과정

💡 Docker Compose 처리 과정
1. Dockerfile에 필요한 모든 서비스를 정의합니다.(Define all your required services in a Dockerfile)
- Dockerfile 내에 각 다운로드 할 이미지와 실행 할 컨테이너에 대해 정의합니다.
2. Compose 파일(YAML/YML) 내에 각 서비스 간의 관계를 정의합니다.(Define the releationship between each service in a Compose file)
- 이 파일에는 실행할 서비스(컨테이너)들과 그 설정들을 포함하고 있습니다. 사용할 파일 내용은 Docker 이미지, 포트 매핑, 볼륨 마운트, 네트워크 설정, 환경 변수 등이 정의됩니다.
3. Docker Compose를 사용하여 애플리케이션을 시작합니다.(Use Docker Compose to start the application)
- Docker Compose의 실행 명령어 ‘docker-compose up’ 명령어를 수행하여 일괄 서비스를 실행합니다.
- 이 명령어를 통해서 Docker Compose 파일에 정의된 모든 서비스를 시작합니다.
- 필요한 Docker 이미지가 로컬에 없으면 자동으로 다운로드하고, 컨테이너를 생성하고 시작합니다.
4. Docker Compose의 서비스 상태를 확인합니다.
- Docker Compose의 상태 확인 명령어 ‘docker-compose ps’ 명령어를 수행하여 서비스의 상태를 확인합니다. 현재 실행 중인 서비스의 상태를 확인할 수 있습니다.
+ 필요에 따라 Docker Compose의 서비스를 중지합니다.
- Docker Compose의 중지 명령어 ‘docker-compose stop’ 명령어를 수행하거나 ‘docker-compose down’ 명령어를 수행하여 모든 서비스를 중지하고 컨테이너, 네트워크, 볼륨을 삭제합니다.
4) Docker 환경 구축 : 간단 구축 (DB 연결 없이)
💡 Docker 환경 구축 : 간단 구축 (DB 연결 없이)
- 데이터베이스 연결 없이 기본적인 KeyCloack 서버를 실행하는 방법을 구성해봅니다.
- 해당 경우에는 개발 모드(start-dev)로 실행되며, 개발 환경에 적합한 간단한 구성이 됩니다.
- ‘인메모리’ 내에 데이터가 저장이 되는 구조입니다. (* 컨테이너 재 실행 시 해당 값은 초기화됩니다.)
Docker - Keycloak
A realm in Keycloak is equivalent to a tenant. Each realm allows an administrator to create isolated groups of applications and users. Initially, Keycloak includes a single realm, called master. Use this realm only for managing Keycloak and not for managin
www.keycloak.org
1. 실행방법 1: Quick Start 방법
💡 실행방법 1: Quick Start 방법
- 공식사이트에서 Docker를 기반으로 실행하는 방법을 알아봅니다.
- 로컬 포트 8080에 노출된 Keycloak을 시작하고, 사용자 이름과 비밀번호를 admin으로 사용하여 초기 관리자 사용자를 생성합니다
# Quick Start 실행
$ docker run -p 8080:8080 -e KC_BOOTSTRAP_ADMIN_USERNAME=admin -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin quay.io/keycloak/keycloak:26.1.0 start-dev
2. 실행방법 2: Docker file 구성 방법
💡 실행방법 2: Docker file 구성 방법
- 위에 와 동일한 구성이지만 Dockerfile 형태로 구성합니다.
FROM quay.io/keycloak/keycloak:26.1.0
ENV KC_BOOTSTRAP_ADMIN_USERNAME=admin
ENV KC_BOOTSTRAP_ADMIN_PASSWORD=admin
EXPOSE 8080
ENTRYPOINT ["/opt/keycloak/bin/kc.sh", "start-dev"]
# docker 컨테이너 이미지 생성
$ docker build -t simple-keycloak .
# docker 컨테이너 생성 및 실행
$ docker run -d -p 9001:8080 --name simple-keycloak simple-keycloak
# [필요 시] docker 컨테이너 중지
$ docker stop simple-keycloak
# [필요 시] docker 컨테이너 삭제
$ docker rm simple-keycloak

3. 실행 결과
3.1. 컨테이너 이미지 다운 확인

3.2. 컨테이너 생성 확인

3.3. keycloak 접속 확인
💡 keycloak 접속 확인
- 지정한 http://localhost:9000 포트로 접근하였을 때, 잘 실행되고 ID/PW : admin으로 지정을 하였습니다.

5) Docker 환경 구축 : 상세 구축(DB 연결 포함)
💡 Docker 환경 구축 : 상세 구축(DB 연결 포함)
- 이전에 간단 연결을 통해 구성하면 ‘인메모리’ 내에 저장되었다가 컨테이너 재실행 시 값이 초기화되는 이유가 발생하였습니다.
- 그렇기에, 컨테이너가 재시작되거나 종료되어도 사용자 데이터 설정, 인증 정보 등을 유지하기 위해 데이터베이스와 연동을 하여 관리합니다.
💡 [참고] Keycloack 인증 서버를 데이터베이스와 사용해야 하는 점
장점 | 설명 |
데이터베이스 연동 | PostgreSQL과 자동 연동되어 데이터를 안정적으로 저장하고 관리할 수 있습니다. |
데이터 지속성 | 볼륨이 자동으로 구성되어 컨테이너가 재시작되어도 데이터가 유지됩니다. |
설정 관리 | 환경 변수를 통해 각종 설정을 중앙에서 쉽게 관리하고 변경할 수 있습니다. |
의존성 관리 | 서비스 간의 의존 관계가 자동으로 처리되어 안정적인 구동이 가능합니다. |
1. Keycloak Dockerfile 구성
💡 Keycloak Dockerfile 구성
- 기본적인 Keycloak 구성 정보가 담긴 Dockerfile을 이용하여 이미지를 구성합니다.
FROM quay.io/keycloak/keycloak:26.1.0
ENV KC_BOOTSTRAP_ADMIN_USERNAME=admin
ENV KC_BOOTSTRAP_ADMIN_PASSWORD=admin
EXPOSE 8080
ENTRYPOINT ["/opt/keycloak/bin/kc.sh", "start-dev"]
2. Docker Compose 파일 구성
💡 Docker Compose 파일 구성
- keycloak 서비스와 postgresql을 실행하기 위한 서비스를 실행합니다.
services:
keycloak:
image: quay.io/keycloak/keycloak:latest
container_name: keycloak
ports:
- "9001:8080"
environment:
- KC_BOOTSTRAP_ADMIN_USERNAME=admin
- KC_BOOTSTRAP_ADMIN_PASSWORD=admin
- KC_DB=postgres
- KC_DB_URL=jdbc:postgresql://postgres:5432/testdb
- KC_DB_USERNAME=localmaster
- KC_DB_PASSWORD=qwer1234
depends_on:
- postgres
postgres:
image: postgres:16-alpine3.21
container_name: postgres
environment:
- POSTGRES_DB=testdb
- POSTGRES_USER=localmaster
- POSTGRES_PASSWORD=qwer1234
volumes:
- postgres_data:/var/lib/postgresql/data
volumes:
postgres_data:
설정 | 설명 |
keycloak.image | Keycloak의 최신버전의 이미지를 받아옵니다. |
keycloak.container_name | 컨테이너의 이름 지정 (keycloak, postgres) |
keycloak.ports | 호스트의 9001 포트를 컨테이너의 8080 포트에 매핑 |
keycloak.KC_BOOTSTRAP_ADMIN_USERNAME | Keycloak 관리자 계정명 설정 |
keycloak.KC_BOOTSTRAP_ADMIN_PASSWORD | Keycloak 관리자 비밀번호 설정 |
keycloak.KC_DB | 사용할 데이터베이스 종류 지정 (postgres) |
keycloak.KC_DB_URL | PostgreSQL 데이터베이스 연결 URL |
keycloak.KC_DB_USERNAME | 데이터베이스 접속 사용자명 |
keycloak.KC_DB_PASSWORD | 데이터베이스 접속 비밀번호 |
keycloak.depends_on | postgres 컨테이너가 먼저 실행되도록 의존성 설정 |
postgres.image | 사용할 PostgreSQL 이미지 버전 지정 |
postgres.POSTGRES_DB | 생성할 PostgreSQL 데이터베이스 이름 |
postgres.POSTGRES_USER | PostgreSQL 사용자 계정명 |
postgres.POSTGRES_PASSWORD | PostgreSQL 사용자 비밀번호 |
volumes | 데이터 영속성을 위한 볼륨 설정 |
3. Docker Compose 실행 : Docker 이미지 생성 및 컨테이너 실행
💡 Docker Compose 실행 : Docker 이미지 생성 및 컨테이너 실행
- Docker 이미지 & 컨테이너를 실행하는 명령어를 통해 실행을 확인합니다.
# 프로젝트 접근
$ cd simple-docker-compose-keycloak
# docker 컨테이너 이미지 생성 & 컨테이너 실행
$ docker compose up -d
# docker compose 상태 확인
$ docker compose ps
# [필요시] 1. 실행 중인 컨테이너, 네트워크, 볼륨 모두 제거
$ docker compose down -v
# [필요시] 2. 이미지 제거 (선택사항)
$ docker rmi simple-keycloak postgres:16-alpine3.21
$ docker rmi simple-docker-compose-keycloak-keycloak:latest
# [필요시] 3. Docker Compose 다시 실행
$ docker compose up -d

💡 [참고] PostgreSQL 기반으로 로컬 데이터베이스 구성이 필요하시면 아래의 글을 참고하시면 도움이 됩니다.
[DB] MacOS에서 PostgreSQL 로컬 데이터베이스 구성 방법
해당 글에서는 PostgreSQL을 로컬 디비로 구성하는 방법에 대해서 공유합니다. 1) PostgreSQL을 설치합니다.💡 PostgreSQL의 버전을 확인하고 설치가 안 되어 있다면 설치를 하고 서비스를 수행합니다.#
adjh54.tistory.com
4. 실행 결과
4.1. 컨테이너 이미지 확인
💡 컨테이너 이미지 확인
- 컨테이너 이미지가 정상적으로 받아짐을 확인하였습니다.

4.2. 컨테이너 상태 확인
💡 컨테이너 상태 확인
- Docker Compose 형태로 컨테이너가 생성되었고 실행됨을 확인하였습니다.

4.3. keycloak 접속 확인

4.4. Docker 내 postgresql 연동 확인
💡 Docker 내 postgresql 연동 확인
- Docker 내에 postgresql에 접근하여서 이를 확인하였습니다.

4.5. Keycloak 사용 테이블 확인
💡 Keycloak 사용 테이블 확인
- Keycloak에서 사용되는 테이블에 대해 확인해 봅니다.
# 예시: user_entity 테이블 구조 확인
$ \\d user_entity
# 예시: realm 테이블의 데이터 확인
$ SELECT id, name FROM realm;
테이블 명 | 설명 |
user_entity | 사용자의 기본 정보와 프로필 데이터를 저장하는 테이블 |
client | Keycloak과 연동되는 클라이언트 애플리케이션의 설정 및 정보를 저장하는 테이블 |
realm | Keycloak의 보안 영역에 대한 설정과 구성 정보를 저장하는 테이블 |
user_role_mapping | 사용자와 역할 간의 매핑 관계를 정의하는 테이블 |
authentication_flow | 사용자 인증 과정의 단계와 흐름을 정의하는 테이블 |
credential | 사용자의 비밀번호 및 기타 인증 관련 정보를 저장하는 테이블 |
오늘도 감사합니다. 😀

그리드형