Aller au contenu principal

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.

· 18 minutes de lecture
Voir la source
Christophe
Amoureux de Markdown, WSL et Docker ~ Curieux insatiable.
Cet article existe aussi en anglais — lire la version originale.

Traduction automatique

Cette traduction a été produite par une IA. Elle peut contenir des contresens ou des maladresses, en particulier sur les termes techniques. En cas de doute, consultez l'article de référence en anglais — c'est lui qui fait foi.

Cet article a plus d'un an, mais il a été relu le 30 juillet 2026 — son contenu est toujours exact.

Faire tourner Oracle Database Server dans un container Docker

⚡
TL;DR

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é.

La base de données est prête à l'emploi

Oracle récupère la liste des employés

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 :

>user@machine: ~/yourproject

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.

https://container-registry.oracle.com/ords/ocr/ba/database/enterprise
Assurez-vous d'être connecté
https://container-registry.oracle.com/ords/ocr/ba/database/enterprise
Page de connexion Oracle

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.

https://container-registry.oracle.com/ords/ocr/ba/database/enterprise
Création de votre 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.

https://container-registry.oracle.com/ords/ocr/ba/database
Cliquez sur enterprise

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

https://container-registry.oracle.com/ords/ocr/ba/database
Acceptation des termes de la licence

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.

https://container-registry.oracle.com/ords/ocr/ba/database
Acceptation du contrat de licence

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 :

>user@machine: ~/yourproject

$ 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 <<EOF
ALTER 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.sql
COMMIT;
EXIT;
EOF

Ce 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 :

Les relations de l&#39;exemple Oracle Human Resources

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 :

>user@machine: ~/yourproject

$ 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 :

>user@machine: ~/yourproject

$ docker network create oracle

Prêt à créer le container​

Vos valeurs pour cette page
défaut
défaut
défaut
défaut
défaut
S'applique aux commandes de cette pageEnregistré uniquement sur cet appareil

Nous sommes prêts à créer notre container en lançant cette commande :

>user@machine: ~/yourproject

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'appellera oracle-db (nous pourrons donc y accéder plus tard avec docker exec -it oracle-db [...]),
  • --network oracle : nous créerons notre container sur le réseau oracle,
  • -p 1521:1521 : Oracle utilise le port 1521 (Oracle Listener) et nous exposons ce port sur notre machine,
  • -p 5500:5500 : optionnel. Oracle utilise un second port 5500 (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, à savoir ORCLCDB (rappel : CDB signifie Container database)
  • -e ORACLE_PDB=ORCLPDB1 : le nom de la PDB Oracle. Ici aussi, nous gardons la valeur par défaut, à savoir ORCLPDB1. (rappel : PDB signifie pluggable 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 fichiers populate_db.sh, sql/hr_create.sql et sql/hr_populate.sql dans notre dossier scripts/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 :

  • 1521 est le numéro de port à utiliser pour se connecter au service Oracle DB,
  • oracle-db est le nom de notre container,
  • ORCLCDB est le nom de notre CDB,
  • ORCLPDB1 est le nom de notre pluggable database,
  • admin est le mot de passe à utiliser et
  • system est l'utilisateur employé lors de la création de la base

Si vous reprenez le script populate_db.sh, nous avions :

# highlight-next-line
sqlplus -S sys/admin@localhost:1521/ORCLCDB AS SYSDBA <<EOF
# highlight-next-line
ALTER SESSION SET CONTAINER = ORCLPDB1;
# highlight-next-line
CONNECT system/admin@orclpdb1
@/docker-entrypoint-initdb.d/startup/sql/hr_create.sql
@/docker-entrypoint-initdb.d/startup/sql/hr_populate.sql
COMMIT;
EXIT;
EOF

Ce 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 : sys est un utilisateur système d'Oracle, admin le mot de passe associé, 1521 notre port exposé et ORCLCDB le nom de notre container database,
  • ALTER SESSION SET CONTAINER = ORCLPDB1; : nous devons créer nos tables et nos enregistrements dans notre base (ORCLPDB1) et
  • CONNECT system/admin@orclpdb1 : system est aussi un utilisateur système d'Oracle, il sera le propriétaire de nos tables, admin est le même mot de passe associé et orclpdb1 est le nom de ce qu'Oracle appelle le service.

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) :

Exécution manuelle du script

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;.

Connecté à la PDB

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

Connecté au CDB

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 <<EOF
ALTER 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.sql
COMMIT;
EXIT;
EOF

Ce 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 :

Le schéma system

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.

Connexion avec le compte system

Vérifier nos données fictives​

Ceci compris, voici comment voir nos données :

  • Lancez docker exec -it oracle-db sqlplus sys/admin@ ORCLPDB1 as sysdba,
  • Puis, dans SQL*Plus, lancez CONNECT system/admin@ orclpdb1,
  • Pour des raisons esthétiques, lancez SET WRAP OFF et SET PAGESIZE 1000 et
  • nous pouvons accéder à nos tables comme ceci : SELECT EMPLOYEE_ID, FIRST_NAME, LAST_NAME, EMAIL FROM EMPLOYEES;

Les données fictives sont bien chargées

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.

https://localhost:5500/em/
Oracle Enterprise Manager Database Express

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

Création d&#39;une connexion dans Oracle SQL Developer en tant que sys

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)

Récupération des données avec Oracle SQL Developer

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.

Oracle récupère les employés

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.

Création d&#39;une connexion dans Oracle SQL Developer en tant que system

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

Nos tables Human Resources

Accéder à notre container Oracle DB avec Oracle SQLPlus​

Une autre façon serait d'utiliser l'image Docker officielle sql*plus comme ceci :

>user@machine: ~/yourproject

Une fois connectés, nous pouvons par exemple obtenir la liste des pays comme ceci :

Oracle sqlplus

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.


🦋 Rejoignez la conversation sur BlueskyUn compte Bluesky gratuit est nécessaire pour aimer, repartager ou commenter. Ce bloc interroge l'API publique de Bluesky directement depuis votre navigateur (sans cookie, sans connexion) — votre adresse IP parvient donc aux serveurs de Bluesky dès que cette section se charge.

Chargement des commentaires…

Cet article vous a-t-il été utile ?
Avez-vous suivi les étapes de cet article ?