Faire tourner Oracle Database Server dans un container Docker
Apprenez à faire tourner Oracle Database Server dans un container Docker. Ce guide pas à pas couvre la mise en place de l'image, l'acceptation de la licence, la génération du token et l'accès à la base de données.
Traduction automatique
Cet article a plus d'un an, mais il a été relu le 30 juillet 2026 — son contenu est toujours exact.

Ce guide complet vous accompagne pas à pas pour faire tourner un serveur Oracle Enterprise Database dans un container Docker. Il couvre tout le processus : création d'un compte Oracle, authentification pour récupérer l'image officielle, déploiement du container avec du stockage persistant et des scripts de démarrage personnalisés. Vous découvrirez les concepts clés de l'architecture multi-tenant d'Oracle (CDB vs PDB) et comment vous connecter à votre base et l'administrer avec des outils comme sqlplus, Oracle SQL Developer et l'interface web Oracle Enterprise Manager.
Au boulot, j'ai dû créer une base de données Oracle Enterprise en local pour pouvoir écrire des scripts dans différents langages et montrer comment se connecter à Oracle avec, par exemple, .Net, NodeJS, Python ou PHP.
L'idée a donc tout de suite été de vérifier s'il existait une image officielle. Elle existe mais, zut, ce n'est pas aussi simple que pour PostgreSQL, MySQL ou MS SQL Server.
Dans cet article, qui est une mise au propre de mes notes, nous allons installer Oracle Enterprise en local dans un container, créer une base avec des données d'exemple et accéder à cette base de plusieurs façons.
C'est un guide pas à pas pour faciliter la vie de ceux qui doivent faire la même chose — moi, par exemple, dans quelques mois, quand j'aurai tout oublié.
Ça prend un moment (Oracle est lent à s'initialiser), mais voici où nous allons : un container Oracle qui tourne, prêt à être interrogé.


Construisons tout ça, en commençant par l'image elle-même.
Télécharger une image Docker pour OracleDB
Oui, il existe bien une image Docker appelée container-registry.oracle.com/database/enterprise:latest mais, avant de pouvoir la télécharger, il faudra faire quelques choses :
- Créer un compte gratuit sur oracle.com
- Générer un token
- Accepter les termes de la licence
- Configurer votre environnement Docker local pour utiliser ce token
Si vous sautez une étape et essayez de télécharger l'image directement, vous obtiendrez cette erreur :
Création d'un compte gratuit sur oracle.com
Rendez-vous sur https://container-registry.oracle.com/ords/ocr/ba/database/enterprise et créez un utilisateur en cliquant sur le bouton / lien Sign In en haut à droite.


Générer un token
Une fois votre utilisateur validé (après réception d'un email), retournez sur le site https://container-registry.oracle.com/ords/ocr/ba/database/enterprise, connectez-vous, cliquez sur votre profil puis choisissez Auth Token.
Cliquez sur le bouton Generate Secret Key et copiez votre SSO Username et votre Secret Key quelque part (dans votre gestionnaire de mots de passe par exemple).
Accepter les termes de la licence
Rendez-vous sur https://container-registry.oracle.com/ords/ocr/ba/database et cherchez enterprise dans la colonne Repository.

Une fois connecté, cliquez sur le bouton Continue qui apparaît à droite.

Une fenêtre popup s'affiche et, en bas, vous devrez cliquer sur Accept.
Optionnel : en retournant sur https://container-registry.oracle.com/ords/ocr/ba/database, vous verrez qu'Oracle a bien enregistré le fait que vous avez accepté ses conditions.

Configurer votre environnement Docker local
Dernière partie : apprendre à Docker que vous pouvez télécharger depuis le registre Oracle.
Allez en ligne de commande et tapez docker login container-registry.oracle.com.
Renseignez votre SSO Username et votre Secret Key (donnés par la page Auth Token sur oracle.com).
Docker affichera Login Succeeded.
Optionnel, voici la commande de déconnexion
Si besoin, exécutez docker logout container-registry.oracle.com pour supprimer l'authentification vers oracle.com sur votre machine.
Optionnel, l'authentification est stockée dans le fichier config.json
En exécutant cat ~/.docker/config.json, vous verrez dans auths la présence du registre Oracle
{ "auths": { "container-registry.oracle.com": {}, "https://index.docker.io/v1/": {} }}Ce fichier de configuration JSON définit les registries Docker autorisées pour l'authentification. Il liste deux registries : Oracle Container Registry et Docker Hub, chacun étant configuré avec un objet vide en attente de credentials (identifiants et tokens d'authentification).
Enfin, vous pouvez récupérer l'image
Si toutes les étapes précédentes ont été correctement réalisées, vous devriez maintenant pouvoir lancer docker pull container-registry.oracle.com/database/enterprise:latest sans erreur et télécharger l'image Docker de 3,5 Go.
L'image latest est énorme mais la slim est trop ancienne
Il existe une image slim d'environ 1,5 Go (docker pull container-registry.oracle.com/database/enterprise:12.2.0.1-slim) mais elle est très ancienne (quelque part en 2018).
Concepts importants à connaître avec Oracle v12 et suivants (passez cette section si vous voulez juste le lancer)
Container database (CDB) versus Pluggable database (PDB)
Dans l'architecture multi-tenant d'Oracle (introduite depuis Oracle 12c), les concepts de Container Database (CDB) et de Pluggable Database (PDB) sont fondamentaux.
Par rapport aux autres moteurs de base de données, une PDB est une base de données tandis que la CDB est l'infrastructure sous-jacente qui gère une ou plusieurs PDB, en partageant des processus d'arrière-plan et de la mémoire.
Dans cet article, nous ne travaillons jamais au niveau CDB
Dans cet article, nous voulons uniquement créer des tables dans une base de données (PDB) — nous devons toujours nous assurer d'être connectés à une PDB au moment de créer des tables. Nous voulons que nos tables soient dans une seule base ; pas « partagées » à la racine du CDB.
Donc, chaque fois que nous devrons travailler sur des tables, assurez-vous de vous connecter à la PDB.
Créer un container de base de données Oracle
Une fois l'image récupérée, nous pouvons créer notre container, c'est-à-dire notre service de base de données Oracle.
La liste des options de ligne de commande supportées est ici : https://container-registry.oracle.com/ords/ocr/ba/database/enterprise#custom-configurations
Si on le souhaite, on peut lancer une commande docker run tout de suite mais, avant, faisons un peu de configuration.
Pourquoi ? Parce que la génération du container est terriblement lente et peut prendre jusqu'à dix minutes.
Pour être le plus efficace possible, nous allons d'abord créer un ensemble de fichiers sur notre disque pour que, pendant la création de la base, Docker crée aussi automatiquement quelques tables et y insère des enregistrements.
Création de quelques fichiers de configuration
Créez un nouveau dossier sur votre disque, allez-y, puis créez le dossier où nous mettrons nos fichiers de démarrage :
$ mkdir -p /tmp/oracle && cd $_ $ mkdir -p scripts/startup
Créons une base d'exemple Human Resources
Oracle fournit des bases d'exemple sur la page Oracle Database Sample Schemas. Vous pouvez y télécharger l'archive db-sample-schemas-23.3.zip, l'ouvrir et aller dans le dossier human_resources. Vous y trouverez un fichier appelé hr_create.sql qui est un exemple de base RH. Il y a un second fichier appelé hr_populate.sql pour remplir les tables avec des données.
Information
Pour simplifier, vous pouvez récupérer ces fichiers en cliquant sur ces deux liens : hr_create.sql et hr_populate.sql.
Téléchargez et copiez ces deux fichiers dans le dossier scripts/startup/sql/ que vous avez créé précédemment.
La deuxième chose à faire est de créer le fichier scripts/startup/populate_db.sh avec le contenu ci-dessous pour automatiser la création de nos tables et insérer des enregistrements dans notre base. Comme dit dans un chapitre précédent, il est important de bien se connecter à la PDB pour que les tables soient créées dans une base de données, pas dans le container.
#!/usr/bin/env bash
sqlplus -S sys/admin@localhost:1521/ORCLCDB AS SYSDBA <<EOFALTER SESSION SET CONTAINER = ORCLPDB1;CONNECT system/admin@orclpdb1@/docker-entrypoint-initdb.d/startup/sql/hr_create.sql@/docker-entrypoint-initdb.d/startup/sql/hr_populate.sqlCOMMIT;EXIT;EOFCe script bash lance sqlplus (l'outil en ligne de commande Oracle) en mode silencieux pour exécuter une série de commandes SQL. Il se connecte à une base de données Oracle avec des paramètres interpolés, bascule vers un conteneur de base de données spécifique, puis exécute deux fichiers SQL qui créent et remplissent un schéma HR (Human Resources), avant de valider les changements.
Rendez maintenant le script exécutable : chmod +x scripts/startup/populate_db.sh.
Les tables appartiendront à l'utilisateur system
Faites attention à l'instruction CONNECT system/admin@ orclpdb1 : nous nous connectons d'abord en tant qu'utilisateur system avant de créer les tables. Les tables seront donc accessibles par cet utilisateur, à savoir l'utilisateursystem`.
Si vous avez besoin du modèle de données, le voici :

Créer le volume OracleDBData
Comme lancer le container est un processus très lent, nous allons créer un volume Docker pour garder la base persistante sur le disque.
Le volume conservera la base sur notre disque, dans un volume géré par Docker. Ainsi, nous pouvons arrêter le container Oracle, le redémarrer et nous ne perdrons pas notre base. La base sera persistante dans un volume auto-géré par Docker.
Lancez cette commande dans la console pour créer un volume géré par Docker :
$ docker volume create OracleDBData
Créer le réseau oracle
Et enfin, nous allons créer un réseau spécifique pour notre container Oracle :
$ docker network create oracle
Prêt à créer le container
Nous sommes prêts à créer notre container en lançant cette commande :
Remarque
C'est terriblement lent... Oracle aura besoin d'environ 10 minutes avant que le container soit utilisable.
La commande docker run était terriblement complexe ; voici le détail :
--name oracle-db: notre container s'appelleraoracle-db(nous pourrons donc y accéder plus tard avecdocker exec -it oracle-db [...]),--network oracle: nous créerons notre container sur le réseauoracle,-p 1521:1521: Oracle utilise le port1521(Oracle Listener) et nous exposons ce port sur notre machine,-p 5500:5500: optionnel. Oracle utilise un second port5500(OEM Express) et nous exposons également ce port pour pouvoir accéder àhttp://localhost:5500,-e ORACLE_SID=ORCLCDB: le SID de la base Oracle (SID signifie System identifier) est un réglage très important. Nous gardons la valeur par défaut, à savoirORCLCDB(rappel :CDBsignifieContainer database)-e ORACLE_PDB=ORCLPDB1: le nom de la PDB Oracle. Ici aussi, nous gardons la valeur par défaut, à savoirORCLPDB1. (rappel :PDBsignifiepluggable database).-e ORACLE_PWD=admin: le mot de passe des utilisateurs SYS, SYSTEM et PDBADMIN. Il n'y a pas de valeur par défaut puisque le mot de passe est généré automatiquement et doit être récupéré dans les logs (docker log). Ce paramètre modifie le mot de passe des utilisateurs SYS, SYSTEM et PDBADMIN.-v OracleDBData:/opt/oracle/oradata: nous rendons la base persistante sur notre disque mais peu importe où, nous laissons Docker gérer ça. Nous avons créé précédemment un volume Docker nomméOracleDBData.-v ./scripts/startup/:/docker-entrypoint-initdb.d/startup: cela nous permet de créer des fichiers en local dans le dossier./scripts/startup(comme nos fichiers SQL) et de les exécuter dans le container une fois la base Oracle principale prête. Et, en effet, nous avons créé précédemment les fichierspopulate_db.sh,sql/hr_create.sqletsql/hr_populate.sqldans notre dossierscripts/startup.
Constantes importantes à retenir
À partir de maintenant, notre serveur de base de données Oracle tourne dans un container Docker. Nous allons beaucoup utiliser certaines constantes.
Voici les constantes à retenir :
1521est le numéro de port à utiliser pour se connecter au service Oracle DB,oracle-dbest le nom de notre container,ORCLCDBest le nom de notre CDB,ORCLPDB1est le nom de notre pluggable database,adminest le mot de passe à utiliser etsystemest l'utilisateur employé lors de la création de la base
Si vous reprenez le script populate_db.sh, nous avions :
# highlight-next-linesqlplus -S sys/admin@localhost:1521/ORCLCDB AS SYSDBA <<EOF# highlight-next-lineALTER SESSION SET CONTAINER = ORCLPDB1;# highlight-next-lineCONNECT system/admin@orclpdb1@/docker-entrypoint-initdb.d/startup/sql/hr_create.sql@/docker-entrypoint-initdb.d/startup/sql/hr_populate.sqlCOMMIT;EXIT;EOFCe script établit une connexion SQL*Plus à une base de données Oracle en tant que SYSDBA, bascule vers un conteneur de base de données pluggable (PDB), se reconnecte avec un utilisateur système, puis exécute deux scripts SQL pour créer et remplir un schéma HR avant de valider les changements.
Et maintenant, vous comprenez pourquoi les chaînes de connexion étaient :
sys/admin@localhost:1521/ORCLCDB:sysest un utilisateur système d'Oracle,adminle mot de passe associé,1521notre port exposé etORCLCDBle nom de notre container database,ALTER SESSION SET CONTAINER = ORCLPDB1;: nous devons créer nos tables et nos enregistrements dans notre base (ORCLPDB1) etCONNECT system/admin@orclpdb1:systemest aussi un utilisateur système d'Oracle, il sera le propriétaire de nos tables,adminest le même mot de passe associé etorclpdb1est le nom de ce qu'Oracle appelle leservice.
Lancer une console interactive dans le container de la base
Si vous devez entrer dans le container, lancez simplement docker exec -it oracle-db bash.
À titre d'exemple fictif, nous pouvons aller dans le dossier /docker-entrypoint-initdb.d/startup à l'intérieur du container et relancer notre script ./populate_db.sh (relancer, car il a déjà été exécuté par Oracle pendant la création du container) :

Et bien sûr, nous obtiendrons plein d'erreurs illustrant le fait que les tables et les enregistrements ont déjà été créés/insérés.
Tapez exit pour quitter la console et revenir au prompt de votre machine hôte.
Travailler avec le container Oracle DB
La commande docker run prendra environ 10 minutes.
Si vous avez Docker Desktop, basculez sur son interface, cliquez sur le lien Containers puis sur votre container oracle-db pour voir le log. Attendez de voir :
Vous obtiendrez le même écran « prêt à l'emploi » déjà montré en début d'article.
Vous pouvez aussi utiliser la ligne de commande : docker logs oracle-db --follow et attendre le message DATABASE IS READY TO USE!. Appuyez sur CTRL+C pour quitter le log.
Maintenant, nous pouvons entrer dans le container oracle-db et lancer SQL*Plus avec docker exec -it oracle-db sqlplus sys/admin@ ORCLPDB1 as sysdba (rappel : nous nous connectons à la PDB, pas au CDB).
Suis-je connecté au container database ou à une pluggable database ?
Lancez simplement, dans la console SQL*Plus, la commande SHOW CON_NAME;.

Si vous êtes connecté au CDB, vous obtiendrez la réponse suivante et c'est faux. Tapez exit et connectez-vous à la PDB.

Un mot sur le schéma
Précédemment, nous avons créé nos tables avec le script scripts/startup/populate_db.sh. Voici le script utilisé :
#!/usr/bin/env bash
sqlplus -S sys/admin@localhost:1521/ORCLCDB AS SYSDBA <<EOFALTER SESSION SET CONTAINER = ORCLPDB1;CONNECT system/admin@orclpdb1@/docker-entrypoint-initdb.d/startup/sql/hr_create.sql@/docker-entrypoint-initdb.d/startup/sql/hr_populate.sqlCOMMIT;EXIT;EOFCe script bash se connecte à une base de données Oracle en tant que SYSDBA avec des paramètres interpolés, puis exécute une séquence de commandes SQL : il bascule vers un conteneur spécifique, se reconnecte avec un autre utilisateur, crée le schéma HR et le remplit avec des données de test.
L'instruction CONNECT utilise l'utilisateur Oracle system. Les tables seront donc créées dans le schéma system.
Si nous lançons docker exec -it oracle-db sqlplus sys/admin@ ORCLPDB1 as sysdba et que nous essayons d'afficher les enregistrements de la table COUNTRIES, ça ne marchera pas à moins de préciser le schéma :

C'est parce que l'utilisateur sys utilise le schéma sys par défaut (on peut le voir en lançant SELECT SYS_CONTEXT('USERENV', 'CURRENT_SCHEMA') FROM dual;).
Voilà pourquoi, puisque nos tables sont dans le schéma system, nous y accédons avec SELECT * FROM SYSTEM.COUNTRIES;.
Mais nous pouvons aussi changer d'utilisateur, ne plus utiliser sys mais system, en lançant CONNECT system/admin@ orclpdb1.

Vérifier nos données fictives
Ceci compris, voici comment voir nos données :
- Lancez
docker exec -itoracle-dbsqlplus sys/admin@ORCLPDB1as sysdba, - Puis, dans SQL*Plus, lancez
CONNECT system/admin@orclpdb1, - Pour des raisons esthétiques, lancez
SET WRAP OFFetSET PAGESIZE 1000et - nous pouvons accéder à nos tables comme ceci :
SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL FROM EMPLOYEES;

Information
SET WRAP OFF nous permet d'utiliser toute la largeur de l'écran au lieu d'une largeur ridicule de 80 caractères et SET PAGESIZE 1000 évite une liste paginée tous les 10 enregistrements.
Accéder à Oracle Enterprise Manager Database Express
Plus tôt, lors de notre commande docker run, nous avons mappé le port 5500 du container sur notre host. Ce port est celui utilisé par Oracle Enterprise Manager Database Express (alias OEM Express).
C'est une application web accessible en surfant sur https://localhost: 5500/em/.
Connectez-vous avec system / admin et orclpdb1 comme nom de container.

Accéder à notre base avec les outils Oracle
Oracle SQL Developer
Vous pouvez télécharger Oracle SQL Developer. C'est un fichier ZIP et, une fois dézippé, vous pouvez lancer l'interface sans devoir installer le logiciel : c'est prêt à l'emploi.
Une fois installé, lancez-le et créez une nouvelle connexion vers :
- Utilisateur
SYS- Rôle
SYSDBA- Mot de passe
admin- Nom d'hôte
127.0.0.1- Port
1521- Nom du service
orclpdb1

Rappel : vous devez vous connecter à notre PDB, pas au CDB
Les tables se trouvent dans la pluggable database (PDB), pas dans le container database (CDB)

Commencez à taper SELECT * FROM system. et appuyez sur CTRL+SPACE pour obtenir la liste des objets de ce schéma. En descendant un peu, vous trouverez employees.

Validez ou tapez simplement le SQL complet SELECT * FROM system.employees. Dans l'exemple ci-dessous, je demande la liste des régions et la liste des employés. Je lance la query en appuyant simplement sur F5 — le même résultat que celui déjà montré en début d'article.
Se connecter à Oracle SQL Developer avec le bon utilisateur
Dans le chapitre précédent, nous avons créé une connexion avec sys comme nom d'utilisateur et, pour cette raison, si nous cliquons sur le menu Tables (Filtered) dans l'arborescence de gauche, nous obtiendrons un paquet de tables mais pas celles de l'utilisateur system, comme notre table employees.

Maintenant, en dépliant la liste des tables, nous voyons les nôtres :

Accéder à notre container Oracle DB avec Oracle SQLPlus
Une autre façon serait d'utiliser l'image Docker officielle sql*plus comme ceci :
Une fois connectés, nous pouvons par exemple obtenir la liste des pays comme ceci :

Interne versus externe
Pour cet article, il n'était pas vraiment nécessaire d'utiliser cette image. Jusqu'ici, nous avons utilisé SQL*Plus plus d'une fois, par exemple quand nous avons lancé docker exec -it oracle-db sqlplus sys/admin@ ORCLPDB1 as sysdba pour nous connecter à la base.
La différence : docker exec -it oracle-db [...] entre dans le container de notre base et lance sqlplus en interne (depuis le container où la base est stockée) tandis que docker run [...] oracle oracletools/sqlplus:v19.18_lin [...] lance sqlplus à l'extérieur, dans un container séparé.
Pour aller plus loin
Maintenant que le container oracle-db tourne, deux articles de suite le réutilisent directement : Transformer une base Oracle en OpenData avec Oracle REST Data Services et Accéder à une base de données Oracle avec .Net, NodeJS, PHP et Python.
Chargement des commentaires…
