Eine Oracle Datenbank in Docker zu betreiben ist im Jahr 2021 keine Selbstverständlichkeit. Nein im Gegenteil, es gibt zwar einige vorgefertigte Docker Images bzw. Hilfsmittel um diese zu erstellen, diese kommen aber mit einigen Einschränkungen daher. Grund für mich, meine eigene (angepasste) Anleitung zur Erstellung eines Docker Images für eine Oracle Datenbank zu schreiben. Aber leider kommt auch diese nicht ohne Einschränkungen daher.
Zunächst einmal ein Disclaimer. Ich habe mich dem Git Repository von oraclebase bedient, dass für alle möglichen Oracle Datenbank Versionen ein Dockerfile zur Erstellung eines entsprechenden Docker Images bereitstellt und dieses nach meinen Wünschen angepasst und vor allem die Option der Installation eines “Release Updates” während der Image Erstellung stark vereinfacht.
Ich habe also einen “Fork” des Git Repositories erstellt. Ihr könnt das Repo hier in meinem Github Bereich (aktuell habe ich nur die Version ol8_19 angepasst) finden.
Die Erstellung des Docker Images setzt zwei Dinge voraus.
- Docker muss installiert sein
- Die im Image enthaltene Datenbank Software und die entsprechenden Patch Archive müssen vorhanden, bzw. in den entsprechenden Unterverzeichnissen abgelegt sein.
Werfen wir noch kurz einen Blick auf die Verzeichnisstruktur:
.
├── Dockerfile
├── README.md
├── patch
| |── p31771877_190000_Linux-x86-64.zip
│ ├── put_patches_here.txt
| └── p6880880_122010_Linux-x86-64.zip
├── scripts
│ ├── healthcheck.sh
│ └── start.sh
|── software
│ ├── apex_21.1_en.zip
│ ├── LINUX.X64_193000_db_home.zip
│ └── put_software_here.txt
└── templates
└── 19EE_Database.rsp
Wie ihr seht, muss die Datenbank Software und die zu installierenden Patches in den jeweiligen Unterverzeichnissen “software” und “patch” abgelegt werden. Ebenfalls unter “patch” ist die benötigte OPatch Version für das jeweilige Release Update abzulegen.
Image Build:
Bei der Image Erstellung gibt es zwei Möglichkeiten (und entsprechend unterschiedliche Kommandos). Zum einen können wir ein Image mit der 19c Basisversion 19.3 durchführen, zum anderen können wir eben ein Release Update (bspw. 19.9) installieren. In beiden Varianten erstellen wir einen TAG um die gewünschte Version später beim Aufbau des Docker Images besser referenzieren zu können.
Generell noch ein Hinweis. Die Oracle Software ist nicht gerade schlank. Ein Docker Image von Oracle 19 kann schnell 12GB oder noch mehr an Platz verwenden.
Für die Installation der Basis Version nutzen wir folgenden docker build
Befehl:
cd ol8_19
docker build -t ol8_oradb:19.3 .
Um zusätzlich noch ein “Release Update” in das Image zu installieren nutzen wir folgenden docker build
Befehl:
cd ol8_19
docker build -t ol8_oradb:19.9 --build-arg INSTALL_PATCH=true --build-arg PATCH_ID=31771877 .
Der Patch wird in das RDBMS im Docker Image installiert. Solltet ihr mit diesem Image eine vorhandene Datenbank starten, wird diese nicht automatisch mit datapatch
gepatcht. Dies müsst ihr zum aktuellen Zeitpunkt manuell tun (siehe Einschränkungen und Blick in die Zukunft weiter unten)
Ihr verbindet euch dazu an einem laufenden Container (dazu kommen wir gleich) und Patcht die Datenbank. Das sieht dann so aus:
docker exec -it ol8_19_con /bin/bash
cd /oracle/product/19_ENT/OPatch
./datapatch
Solltet ihr eine neue Datenbank mit diesem Image erstellen (also einen Brandneuen Container starten), wird die Datenbank gleich mit dem gepatchen Stand aufgebaut.
Starten des Containers:
Das Image des Containers wurde auf dem Docker Host in das Image Repository aufgenommen wenn der docker build
Vorgang erfolgreich abgeschlossen ist. Ob das Image vorhanden ist, könnt ihr mit docker image list
prüfen.
Jetzt ist es an der Zeit, unseren Docker Container zu starten. Beim ersten Start wird hier automatisch geprüft, ob eine Datenbank in dem als persistentes Volume angegeben Pfad abliegt. Falls nein, wird eine neue Datenbank erstellt. In dem unten stehenden Beispiel erstellen wir einen Container mit dem Namen ol8_19_con. Der Listener Port 1521 im Container wird auf den Port 1521 des Docker Hosts gemappt. Ebenso der Port 5500 (siehe dazu Einschränkungen weiter Unten). Den Docker Host Pfad /docker/oracle/ORATST geben wir als persistentes Laufwerk /db_data in unser Docker Image weiter. Hier werden die Datenbankdateien und alle Konfigurationsdateien der Datenbank abgelegt. Somit ist auch die Konfguration der DB über Neustarts hinweg persistent. Für den ersten Start vergeben wir das SYS und SYSTEM Benutzer Passwort. Als letzten Parameter geben wir noch an, dass wir den Container aus dem Image ol8_oradb:19.9 erstellen wollen.
docker run -dit --name ol8_19_con -p 1521:1521 -p 5500:5500 -v /docker/oracle/ORATST/:/db_data -e "ORACLE_SID=ORATST" -e "SYS_PASSWORD=Initial!" --restart unless-stopped ol8_oradb:19.9
Der erste Start des Containers wird einige Zeit in Anspruch nehmen da die Datenbank erst erstellt werden muss. Ihr könnt den Erstellungsprozess mit folgendem Befehl verfolgen. Dieser Befehl kann generell zum Troubleshooting verwendet werden um Fehlermeldungen der Datenbank direkt feststellen zu können.
docker logs --follow ol8_19_con
Wenn die Erstellung der DB abgeschlossen ist, können wir uns über den Port 1521 an der Datenbank anmelden und damit arbeiten wie gewohnt. Es ist natürlich ebenfalls möglich soch mit dem Container zu verbinden. Dazu nutzen wir folgenden Befehl:
docker exec -it ol8_19_con /bin/bash
Einschränkungen und ein Blick in die Zukunft:
- Mein letzter Kenntnisstand ist, dass Oracle für keine Datenbank Support anbietet, über dem Release 12.2. Hier wird schon seit langer Zeit angekündigt, dass sich das bald ändern soll. Das bedeutet effektiv, für den Einsatz in einer produktiven Umgebung, ein erhöhtes Risiko. Weiterhin gibt Oracle nur Support, sofern der Docker Host auf Oracle Linux 7 oder höher betrieben wird.
- Die initiale Erstellung einer Datenbank dauert in meiner Version des Dockerfiles verhältnismäßig lange. Der Grund dafür ist, dass ich mich nicht einer Seed Datenbank bediene für die Erstellung der Datenbank, sondern alles komplett durch die Oracle Software aufgebaut wird (Datafiles werden angelegt, Katalog wird erzeugt usw.) Ich plane das in naher Zukunft zu ändern. Dann wird die initiale Erstellung der Datenbank ca. 10 Minuten in Anspruch nehmen.
- Ich plane die Installation von “Release Updates” noch weiter zu vereinfachen was das eigentliche Update einer existierenden Datenbank betrifft. Ich werde hierzu eine Prüfung in das Startskript einbauen. Nachdem eine Datenbank gestartet wurde, soll geprüft werden ob der im Image (also dem RDBMS) installierte Releasestand auch in der Datenbank angewendet wurde. Falls nicht, wird nach dem Hochfahren der DB ein
datapatch
durchgeführt. - Bis jetzt habe ich nur die Anpassungen an dem Dockerfile und den Skripten für die Version ol8_19 gemacht. Die anderen enthaltenen Dockerfiles im Repository sind nicht angepasst und entsprechen noch der Version von oraclebase. Ich versuche das zeitnah zu ändern.
- Der Port 5500 für den Enterprise Manager Express wird zwar aus dem Container heraus bereitgestellt, die Installation der Datenbank wird aber im Moment immer ohne die Installation vom EM Express durchgeführt. Ich plane das in Zukunft entsprechend einstellbar zu gestalten.
Philip