Ce guide vous permet d'installer Keycloak avec Docker pour le développement et la formation. Vous apprendrez à démarrer Keycloak rapidement, configurer Docker Compose avec PostgreSQL, et accéder à la console d'administration.
Ce que vous allez apprendre
Section intitulée « Ce que vous allez apprendre »À la fin de cette leçon, vous saurez :
- Démarrer Keycloak en mode dev pour tester rapidement
- Configurer Docker Compose avec PostgreSQL pour la persistance
- Accéder à la console d'administration et créer un compte admin
- Identifier les variables essentielles de configuration
Prérequis
Section intitulée « Prérequis »- Docker installé (guide d'installation)
- Docker Compose (inclus dans Docker Desktop, ou
docker-compose-pluginsur Linux)
Les deux modes d'exécution
Section intitulée « Les deux modes d'exécution »Keycloak ne se lance pas de la même façon selon l'usage : la sous-commande passée au conteneur (start-dev ou start) décide de la base de données, du TLS et du cache. Le tableau ci-dessous se lit ligne par ligne comme une liste de renoncements : chaque case de la colonne « développement » est un contrôle désactivé pour vous éviter une configuration. La ligne Base de données est la plus lourde de conséquences, start-dev utilise par défaut H2 en fichier local, à l'intérieur du conteneur, donc tout realm créé disparaît dès que le conteneur est supprimé.
| Aspect | Mode développement (start-dev) | Mode production (start) |
|---|---|---|
| Base de données | H2 embarqué, fichier local (dev-file) | PostgreSQL, MySQL, MariaDB |
| TLS/HTTPS | Désactivé | Obligatoire |
| Hostname | localhost par défaut | Doit être configuré |
| Cache | Local uniquement | Distribué (Infinispan) |
| Usage | Tests, labs, formation | Production, staging |
Démarrage rapide (sans persistance)
Section intitulée « Démarrage rapide (sans persistance) »Cette commande sert à voir la console d'administration en moins de deux minutes, sans écrire un seul fichier. Le premier démarrage prend une dizaine de secondes le temps que Quarkus construise son augmentation : tant que la ligne started in n'apparaît pas dans les logs, le port 8080 refuse les connexions. Les identifiants passés par KC_BOOTSTRAP_ADMIN_* ne sont lus qu'au tout premier lancement, quand la base est encore vide.
La méthode la plus rapide pour tester Keycloak :
docker run -p 8080:8080 \ -e KC_BOOTSTRAP_ADMIN_USERNAME=admin \ -e KC_BOOTSTRAP_ADMIN_PASSWORD=admin \ quay.io/keycloak/keycloak:26.7.0@sha256:0f198be292568439d700cdbfb893e69a6009bb43a94a06a945b1d3d506c76b13 \ start-devCe que fait cette commande :
- Télécharge l'image Keycloak 26.7.0 depuis Quay.io
- Lance Keycloak sur le port 8080
- Crée un compte admin temporaire
admin/admin - Démarre en mode développement avec le pilote
dev-file(H2 écrit dans/opt/keycloak/data/h2/keycloakdb.mv.db)
Vérification : Ouvrez http://localhost:8080
Docker Compose avec PostgreSQL (recommandé)
Section intitulée « Docker Compose avec PostgreSQL (recommandé) »Deux conteneurs suffisent : PostgreSQL détient les realms, les utilisateurs et les clients, Keycloak ne garde rien sur son propre disque. Le point à ne pas rater dans le fichier ci-dessous est le couple healthcheck sur PostgreSQL et condition: service_healthy sur Keycloak. Sans lui, Keycloak démarre plus vite que la base, échoue sur une connexion JDBC refusée et le conteneur sort en boucle. Le volume nommé postgres_data est ce qui survit à un docker compose down ; c'est aussi lui que -v détruit.
Le service Keycloak garde la commande start-dev : la base est bien PostgreSQL (KC_DB: postgres), mais le TLS et le hostname de production restent hors du périmètre de ce guide. Les mots de passe keycloak et admin sont ceux d'un lab jetable, ne les réutilisez jamais ailleurs.
Pour un environnement de formation avec persistance des données :
-
Créer le répertoire de travail
Fenêtre de terminal mkdir -p ~/Projets/keycloak && cd ~/Projets/keycloak -
Créer le fichier
docker-compose.ymldocker-compose.yml services:postgres:image: postgres:16-alpine@sha256:cf78e76683b9ca8c5733cbbdce6c9262b45b6767934dd0a95e671f9a0fc20685container_name: keycloak-dbenvironment:POSTGRES_DB: keycloakPOSTGRES_USER: keycloakPOSTGRES_PASSWORD: keycloakvolumes:- postgres_data:/var/lib/postgresql/datahealthcheck:test: ["CMD-SHELL", "pg_isready -U keycloak"]interval: 5stimeout: 5sretries: 5networks:- keycloak-netkeycloak:image: quay.io/keycloak/keycloak:26.7.0@sha256:0f198be292568439d700cdbfb893e69a6009bb43a94a06a945b1d3d506c76b13container_name: keycloakcommand: start-devenvironment:KC_DB: postgresKC_DB_URL: jdbc:postgresql://postgres:5432/keycloakKC_DB_USERNAME: keycloakKC_DB_PASSWORD: keycloakKC_HOSTNAME: localhostKC_BOOTSTRAP_ADMIN_USERNAME: adminKC_BOOTSTRAP_ADMIN_PASSWORD: adminports:- "8080:8080"depends_on:postgres:condition: service_healthynetworks:- keycloak-netvolumes:postgres_data:networks:keycloak-net:driver: bridge -
Démarrer les services
Fenêtre de terminal docker compose up -d -
Suivre les logs
Fenêtre de terminal docker compose logs -f keycloakAttendez de voir :
Keycloak 26.7.0 on JVM (powered by Quarkus 3.33.2.1) started in 10.505s. Listening on: http://0.0.0.0:8080 -
Ouvrir la console
Accédez à http://localhost:8080
Accéder à la console d'administration
Section intitulée « Accéder à la console d'administration »En Keycloak 26, la racine http://localhost:8080 renvoie une redirection 302 vers /admin/, elle-même redirigée vers /admin/master/console/ : vous atterrissez donc directement sur l'écran de connexion de la console. Le compte que vous y utilisez est un administrateur temporaire, créé au tout premier démarrage à partir des variables KC_BOOTSTRAP_ADMIN_*. Les logs le disent explicitement avec KC-SERVICES0077: Created temporary admin user. Sur une base déjà initialisée, ce compte n'est pas recréé : changer les variables dans le fichier Compose ne changera pas le mot de passe.
-
Ouvrez votre navigateur à l'adresse http://localhost:8080, vous êtes redirigé vers
/admin/master/console/ -
Connectez-vous avec les identifiants définis au démarrage :
- Username :
admin - Password :
admin
- Username :
-
Vous arrivez sur le Master Realm, l'espace d'administration global
Variables de configuration essentielles
Section intitulée « Variables de configuration essentielles »Keycloak se configure via des variables d'environnement (préfixées KC_) ou des options CLI (préfixées --).
Base de données
Section intitulée « Base de données »Ces quatre variables sont le minimum pour sortir de H2. KC_DB sélectionne le pilote JDBC embarqué dans l'image parmi dev-file, dev-mem, mariadb, mssql, mysql, oracle, postgres et tidb, et c'est lui qui détermine la syntaxe attendue par KC_DB_URL : une URL PostgreSQL passée avec KC_DB: mysql fait échouer le démarrage, pas une requête ultérieure. Un mot de passe en clair dans KC_DB_PASSWORD convient à un lab, mais il reste lisible par docker inspect ; pour la production, Keycloak lit ses secrets depuis une source KeyStore déclarée par --config-keystore.
| Variable | Description | Exemple |
|---|---|---|
KC_DB | Type de base de données | postgres, mysql, mariadb |
KC_DB_URL | URL JDBC de connexion | jdbc:postgresql://host:5432/db |
KC_DB_USERNAME | Utilisateur de la base | keycloak |
KC_DB_PASSWORD | Mot de passe | secret |
Administration initiale
Section intitulée « Administration initiale »Ces deux variables n'ont d'effet que sur une base vierge. Keycloak les lit au premier démarrage, crée l'administrateur temporaire du realm master, puis les ignore définitivement. Un mot de passe modifié dans le fichier Compose après coup ne sera donc jamais appliqué ; il faut soit repartir d'un volume vide, soit changer le mot de passe depuis la console.
| Variable | Description |
|---|---|
KC_BOOTSTRAP_ADMIN_USERNAME | Nom de l'admin initial |
KC_BOOTSTRAP_ADMIN_PASSWORD | Mot de passe admin initial |
KC_HOSTNAME est la variable qui cause le plus d'échecs derrière un reverse proxy. Keycloak s'en sert pour construire les URL absolues qu'il place dans ses réponses OIDC : l'issuer des jetons, les redirections d'authentification, les liens du document de découverte /.well-known/openid-configuration. Si la valeur ne correspond pas à ce que le navigateur a réellement tapé, le client OIDC rejettera les jetons pour cause d'issuer incohérent, alors même que la page de login s'affichait correctement.
| Variable | Description | Exemple |
|---|---|---|
KC_HOSTNAME | Hostname public | localhost, auth.example.com |
KC_HTTP_PORT | Port HTTP | 8080 |
Fonctionnalités
Section intitulée « Fonctionnalités »Les deux premières variables activent l'observabilité et méritent d'être posées dès le lab, parce que leur comportement a changé en Keycloak 25 (guide de migration, « Management port for metrics and health endpoints ») : les endpoints correspondants ne répondent plus sur le port applicatif mais sur un port de management séparé. KC_LOG_LEVEL: DEBUG est utile ponctuellement, mais il génère un volume de logs qui noie les messages utiles ; réservez-le à la reproduction d'un problème précis.
| Variable | Description | Exemple |
|---|---|---|
KC_HEALTH_ENABLED | Endpoints /health/* (sur le port de management 9000) | true |
KC_METRICS_ENABLED | Métriques Prometheus (sur le port 9000) | true |
KC_LOG_LEVEL | Niveau de log | INFO, DEBUG |
Commandes utiles
Section intitulée « Commandes utiles »Gestion des conteneurs
Section intitulée « Gestion des conteneurs »Une seule de ces commandes est destructrice, et c'est la dernière. docker compose down arrête et supprime les conteneurs mais conserve le volume postgres_data : vos realms sont toujours là au prochain up. L'option -v supprime en plus le volume, donc la base entière. Retenez la distinction avant de la taper machinalement pour « repartir propre ».
# Démarrerdocker compose up -d
# Arrêterdocker compose down
# Voir les logsdocker compose logs -f keycloak
# Redémarrer Keycloakdocker compose restart keycloak
# Supprimer tout (y compris les données)docker compose down -vÉtat et diagnostic
Section intitulée « État et diagnostic »docker compose ps vous dit que le processus tourne, pas que Keycloak est prêt à servir. Entre le démarrage du conteneur et la première réponse HTTP, il s'écoule une dizaine de secondes pendant lesquelles Docker publie déjà le port 8080 alors que Keycloak n'y écoute pas encore : la connexion est refusée. Le test qui fait foi est donc une requête applicative : /realms/master renvoie un JSON et un code 200 dès que le realm est monté, ce qui en fait un point de contrôle utilisable dans un script d'attente.
# Vérifier que Keycloak répond (le realm master renvoie 200 une fois prêt)curl -sf http://localhost:8080/realms/master >/dev/null && echo "Keycloak prêt"
# Voir l'état des conteneursdocker compose psDépannage
Section intitulée « Dépannage »La plupart des blocages au démarrage viennent de la base de données, pas de Keycloak. Avant de lire le tableau, sortez le vrai message avec docker compose logs keycloak : Quarkus affiche la cause racine sur la ligne Caused by, souvent bien plus bas que la stacktrace initiale. La colonne « Cause probable » ci-dessous vous oriente ensuite vers le bon fichier à corriger.
| Symptôme | Cause probable | Solution |
|---|---|---|
Connection refused (DB) | PostgreSQL non démarré | Attendre le healthcheck ou docker compose restart |
FATAL: password authentication failed | Mauvais credentials DB | Vérifier les variables KC_DB_* |
Port already in use | Port 8080 occupé | Utiliser un autre port : 8180:8080 |
| Page blanche au login | Navigateur cache | Ctrl+F5 ou mode navigation privée |
Réinitialiser complètement
Section intitulée « Réinitialiser complètement »Ce couple de commandes est le seul moyen fiable de retrouver un environnement identique à une première installation, notamment pour reprendre la main quand vous avez oublié le mot de passe de l'administrateur temporaire. La suppression du volume remet la base à zéro, donc les variables KC_BOOTSTRAP_ADMIN_* redeviennent effectives au démarrage suivant. Sur un lab de formation c'est sans risque ; ailleurs, sauvegardez d'abord vos realms avec un export.
Pour repartir de zéro (supprime toutes les données) :
docker compose down -vdocker compose up -dÀ retenir
Section intitulée « À retenir »- Docker Compose est la méthode recommandée pour la formation
- Mode
start-dev= développement uniquement (pas de TLS, pas de prod) - PostgreSQL pour la persistance des données
- Variables
KC_BOOTSTRAP_ADMIN_*pour créer l'admin initial (dépréciées :KEYCLOAK_ADMIN*) - Console admin : http://localhost:8080 redirige vers
/admin/master/console/ - Master Realm : réservé à l'administration, ne pas y créer d'applications
Contrôle de connaissances
Section intitulée « Contrôle de connaissances »Six questions tirées sur huit : où start-dev garde ses données, le rôle du healthcheck, les variables d'administration initiale, la commande qui détruit la base, KC_HOSTNAME et les tags publiés.
Contrôle de connaissances
Validez vos connaissances avec ce quiz interactif
Informations
- Le chronomètre démarre au clic sur Démarrer
- Questions à choix multiples, vrai/faux et réponses courtes
- Vous pouvez naviguer entre les questions
- Les résultats détaillés sont affichés à la fin
Lance le quiz et démarre le chronomètre
Vérification
(0/0)Score par domaine
Un domaine regroupe plusieurs guides et reçoit plusieurs questions : son score est plus fiable qu'un score par thème, qui porte souvent sur une seule question.
Bilan
Points forts
Aucun sujet réussi à 80 % sur au moins deux questions pour l’instant.
Points faibles
Aucun sujet sous le seuil de réussite.
À faire ensuite
Des indices pour retenter votre chance ?
Continuer le cours : Administrer Keycloak : realms, users, roles
Nouveau quiz complet avec des questions aléatoires
Retravailler uniquement les questions ratées
Retour à la liste des certifications
Ressources
Section intitulée « Ressources »- Documentation officielle : keycloak.org/documentation
- Release notes : keycloak.org/docs/latest/release_notes
- Guide conteneurs : keycloak.org/server/containers
- Guide de migration : keycloak.org/docs/latest/upgrading