Schnell und einfach: Erstellen einer lokalen APEX-Umgebung mit Docker-Compose
In der Welt der Softwareentwicklung ist Effizienz von größter Bedeutung. Oftmals benötigen Entwicklerinnen und Entwickler eine Umgebung, in der sie neue Ideen ausprobieren oder Funktionalitäten präsentieren können, ohne dabei aufwändige System-Einrichtungen durchführen zu müssen. Hierbei kann die Verwendung von Docker und Docker-Compose eine praktische Lösung bieten. In diesem Artikel zeigen wir, wie man schnell und unkompliziert eine lokale APEX-Umgebung mithilfe von Docker-Compose aufsetzen kann.
Bevor wir jedoch tiefer in die Thematik eintauchen, werfen wir einen kurzen Blick auf die einzelnen Technologien.
APEX (Application Express) ist ein leistungsstarkes Low-Code-Framework von Oracle, welches ermöglicht, webbasierte Anwendungen schnell zu entwickeln. Mit APEX können Entwicklerinnen und Entwickler ohne umfangreiche Programmierkenntnisse Anwendungen erstellen, die auf einer Oracle-Datenbank laufen.
Um eine APEX-Anwendung lokal auszuführen, benötigen wir jedoch noch weitere Komponenten. Die ORDS (Oracle REST Data Services) sind ein Dienst, welcher ermöglicht, HTTP(S)-basierte Zugriffe auf die Oracle-Datenbank und APEX-Anwendungen bereitzustellen. Durch die Kombination einer Datenbank, APEX und den ORDS, können wir eine vollständige Entwicklungsumgebung erstellen, die uns ermöglicht, schnell und einfach neue Funktionen zu testen oder Demos zu präsentieren.
Um unsere APEX-Umgebung schnell und einfach aufzubauen, kommt an dieser Stelle Docker ins Spiel. Docker ermöglicht es uns, Anwendungen und ihre Abhängigkeiten in sogenannten Containern zu isolieren, was eine einfache Bereitstellung und Portabilität gewährleisteten. Docker-Compose ist ein Teil von Docker und ermöglicht es, mehrere Docker-Container zu definieren und diese als eine Anwendung zu konfigurieren. Mit Docker-Compose können wir also unsere APEX-Umgebung inklusive aller notwendigen Komponenten schnell und einfach konfigurieren und starten.
Zusammengefasst benötigen wir drei Komponenten für unser Vorhaben:
- Oracle Datenbank
- Oracle ORDS
- Docker bzw. Docker-Compose
In den folgenden Abschnitten betrachten wir genauer, wie wir eine solche lokale APEX-Umgebung mit diesen drei Komponenten erstellen und konfigurieren können.
Lokale Umgebung einrichten
Zum Start öffnen wir die Konsole und erstellen auf unserem Dateisystem ein neues Verzeichnis, in welchem wir alle benötigten Dateien strukturiert ablegen können. Dieses Verzeichnis dient als Homeverzeichnis des APEX-Projektes und muss in einer Umgebungsvariable gesetzt werden, damit wir beispielsweise in den folgenden Schritten relative Pfade verwenden können. Dazu wechseln wir in das Verzeichnis und führen folgenden Befehl aus:
export APEX_HOME=$(pwd)
Die wichtigste Datei ist docker-compose.yml, welche in dem folgenden Codebeispiel dargestellt ist. Diese Datei können Sie übernehmen und in dem neu erstellten Verzeichnis ablegen.
networks: mynetwork: services: oracle_db: image: container-registry.oracle.com/database/express:latest hostname: OracleDB container_name: OracleDB ports: - 1521:1521 environment: - ORACLE_PWD=ordix volumes: - $APEX_HOME/data:/opt/oracle/oradata networks: - mynetwork oracle_ords: image: container-registry.oracle.com/database/ords:latest hostname: OracleORDS container_name: OracleORDS ports: - 8181:8181 volumes: - $APEX_HOME/ords:/opt/oracle/variables networks: - mynetwork depends_on: oracle_db: condition: service_healthy
Die docker-compose.yml beschreibt die gesamte Umgebung, also alle Komponenten, welche für das lokale APEX benötigt werden. Lassen Sie uns nun tiefer in die Details der docker-compose.yml eintauchen, um unsere lokale APEX-Umgebung aufzusetzen.
Konfiguration
Als Erstes definieren wir auf oberster Ebene das Netzwerk, welches wir für unsere Container verwenden möchten. In diesem Fall nennen wir es 'mynetwork'. Das Netzwerk ermöglicht es den Containern, miteinander zu kommunizieren und Verbindungen herzustellen.
In der zweiten Ebene definieren wir die einzelnen Services bzw. Container, die wir in unserer APEX-Umgebung benötigen. Diese konfigurieren wir mithilfe von einigen Attributen. Unter anderem weisen wir den Containern an dieser Stelle auch das gerade erstellte Netzwerk zu.
Der erste Container soll unsere Oracle-Datenbank beherbergen. Diese wird aus dem offiziellen Oracle Repository geladen. Genauer gesagt laden wir die aktuelle Express-Edition herunter. Dieses Image bildet die Basis für unseren Container.
Mit den nächsten Attributen vergeben wir den Container- bzw. Hostnamen 'OracleDB'. Um auch auf die Datenbank zugreifen zu können, leiten wir den Port 1521 des Containers auf den Host-Port 1521 weiter. Hierdurch kommen wir über diesen Port auf die Datenbank. Das heißt, man kann diese auch wie bei einer gewöhnlichen lokalen Installation über den SQL Developer erreichen und dort verwalten. Zusätzlich setzen wir die Umgebungsvariable 'ORACLE_PWD' auf 'ordix', um ein Passwort für die Datenbank festzulegen.
Den Punkt Volumes möchte ich an dieser Stelle etwas detaillierter betrachten. Volumes sind organisatorische Speicherbereiche bzw. Verzeichnisse, die auf dem Hostsystem liegen, aber auch von dem Container genutzt werden. Dazu mappt man ein Verzeichnis des Hostsystems auf eines des Containers. Einerseits kann man dem Container so direkt beim Starten schon Dateien mitgeben und andererseits kann der Container eigenständig Daten dort persistieren. Ein Herunterfahren des Containers führt also nicht mehr zu Datenverlust, da alles auf dem Hostsystem gespeichert ist.
In unserem Fall geben wir ein Volume an. Dieses sollten wir als Erstes in unserem Projektverzeichnis als Ordner anlegen:
mkdir data
In dem Ordner „data“ soll der Container die Nutzdaten persistieren, daher kann dieser erstmal leer gelassen werden. Zur Laufzeit wird dieser Ordner dann vom Container befüllt.
Als Letztes wird der 'oracle_db'-Service dem Netzwerk 'mynetwork' zugeordnet, damit er mit anderen Services in diesem Netzwerk kommunizieren kann.
Der zweite Service ist 'oracle_ords' und dieser verwendet das Oracle REST Data Services-Image. Dieser Service stellt die REST-Schnittstelle für unsere APEX-Anwendung bereit. Auch hier definieren wir einen Host- und Containernamen, in diesem Fall 'OracleORDS'.
Der Port 8181 des Containers wird auf den Host-Port 8181 weitergeleitet, um auf den ORDS-Dienst zugreifen zu können.
Ähnlich wie beim vorherigen Service binden wir ein Volume an, welches dem Container mitgegeben wird. Dazu legen wir erneut einen Ordner an:
mkdir ords
In unserem Fall brauchen wir in diesem Ordner eine Datei, die dem ORDS die Verbindungsinformationen zur Datenbank bereitstellt:
echo 'CONN_STRING=sys/ordix@OracleDB:1521/XEPDB1' > ords/conn_string.txt
Abschließend wird dieser Service ebenfalls dem Netzwerk 'mynetwork' zugeordnet. Zudem bauen wir eine Abhängigkeit zum Service 'oracle_db' ein. Dadurch stellen wir sicher, dass der ORDS-Service erst startet, wenn der Datenbank-Service gestartet bzw. healthy ist.
Mit dieser Docker-Compose-Datei können wir jetzt unsere APEX-Umgebung mit nur einem Befehl hochfahren. Das ermöglicht uns, schnell neue Funktionen auszuprobieren, Demos vorzuführen oder einfach unsere APEX-Anwendung lokal zu entwickeln.
Starten der Umgebung
Das Hochfahren unserer APEX-Umgebung funktioniert aus unserem Home-Verzeichnis heraus mit folgendem Befehl:
docker-compose up -d
Bei dem erstmaligen Ausführen wird die gesamte Datenbank erstellt und die APEX-Instanz installiert, daher dauert es etwas länger. Außerdem kann es passieren, dass die Ausgabe nach ca. 7 Minuten abbricht, weil der ORDS-Service starten möchte, obwohl die Datenbank noch nicht bereit ist. Dieser Fehlerfall kann ignoriert werden, da die Datenbank im Hintergrund trotzdem weiter erstellt wird. Nach insgesamt ca. 10–15 Minuten ist die Erstellung abgeschlossen und der Container sollte mit folgendem Befehl als 'healthy' angezeigt werden:
docker ps
Nun können wir unsere gesamte Umgebung erneut starten. Dieses Mal wird auch der ORDS gestartet und nach ca. 10 weiteren Minuten ist unsere Umgebung bereit genutzt zu werden.
Wie man sehen kann, ist das erstmalige Starten der Umgebung etwas zeitaufwändig. Ab jetzt dauert jedes erneute Starten jedoch nur noch ca. 1 Minute und ist vergleichsweise schnell.
Auf die APEX-Login-Seite gelangen wir mit einem Browser unserer Wahl:
http://localhost:8181/ords
Zum Anmelden als APEX-Admin geben wir folgende Daten ein:
Workspace: INTERNAL
User: ADMIN
Passwort: Welcome_1
Jetzt befinden wir uns im Internal Workspace. Von diesem Punkt aus legen wir neue Workspaces und User an.
Fazit
Docker-Compose ermöglicht es, die benötigten Container und Services zu konfigurieren und mit einem einzigen Befehl hochzufahren. Dies beschleunigt die Entwicklung und ermöglicht es, schnell neue Funktionen zu testen und Demos zu präsentieren.
Mit dieser lokalen APEX-Umgebung können Entwicklerinnen und Entwickler nun flexibel arbeiten und neue Ideen ohne große Setup-Aufwände entwickeln und testen. Docker-Compose macht es möglich, die APEX-Entwicklungsumgebung auf Knopfdruck zu starten und zu nutzen, was die Produktivität und Effizienz erheblich steigert.
Seminarempfehlungen
ORACLE APEX ANWENDUNGSENTWICKLUNG GRUNDLAGEN DB-ORA-46
ZUM SEMINARORACLE APEX ANWENDUNGSENTWICKLUNG AUFBAU DB-ORA-47
ZUM SEMINARConsultant bei ORDIX
Bei Updates im Blog, informieren wir per E-Mail.
Kommentare 1
Hallo, zumindest mit den aktuellen Images von EXPRESS (https://container-registry.oracle.com/ords/ocr/ba/database/express; 21.3.0-xe) und ORDS (https://container-registry.oracle.com/ords/ocr/ba/database/ords; 24.3.0) funktioniert die o.g. docker-compose nicht.
Mutmaßlicher Grund: APEX wird beim Image "ORDS" NICHT mit ausgeliefert und installiert, sondern man muß es extra installieren. Beim Image "ORDS-DEVELOPER" (https://container-registry.oracle.com/ords/ocr/ba/database/ords-developer) hingegen scheint es mit ausgeliefert zu werden.