Ich möchte eine lokale Oracle Datenbank mit Docker laufen lassen um so einige Sachen schnell lokal testen zu können. Hintergrund ist eine anstehende Cloud zu Cloud Migration einer bestehenden Anwendung, bei der zugleich die Oracle DB und Java aktualisiert werden wird.
Docker Image
Bei PostgreSQL war das mit der gedockerten Datenbank relativ einfach. Oracle macht es etwas schwieriger. Einfache Images, die man auf dem Docker Hub finden kann, existieren nicht. Statt dessen muss man ein GitHub Repository clonen und ein Shell Script ausführen, um ein Image zu erzeugen und in die lokale Registry zu schieben.
Frei verfügbar sind nur die Versionen Oracle Database 18c XE, 21c XE and 23c FREE.
Ich entscheide mich, für die beiden Versionen 21c XE und 23c FREE das Image zu erzeugen und dann zuerst mit Version 23c FREE zu testen und ggf. später weitere Tests mit Version 21c XE machen zu können.
cdmkdir oracle cd oracle git clone https://github.com/oracle/docker-images.git cd docker-images/OracleDatabase/SingleInstance/dockerfiles/ ./buildContainerImage.sh -h ./buildContainerImage.sh -f 23.2.0 # Oracle Database container image for 'free' version 23.2.0 is ready to be extended: # # --> oracle/database:23.2.0-free # # Build completed in 608 seconds. ./buildContainerImage.sh -x 21.3.0 # Version 23.2.0 does not have Express Edition available.
Die Erzeugung des zweiten Images hat leider nicht funktioniert. Da das erste Image schon so lange gebraucht hat und ich das zweite Image nur proaktiv anlegen wollte, bin ich auch momentan nicht großartig motiviert, dem jetzt weiter nachzugehen. Version 23c FREE reicht erst einmal.
Image direkt von Oracle
Nach dieser Doku kann man das Image auch direkt aus der Oracle Registry ziehen. Zumindest für Oracle Database 23c Free – Developer Release.
Docker Container
Die Dokumentation hat einen speziellen Abschnitt für 23c FREE
Den Abschnitt auf jeden Fall gut ansehen, ich habe den Container mit folgendem Befehl erzeugt:
docker run --name ingosOracleDB \ -p 1521:1521 \ -e ORACLE_PWD=ingo5Password \ -e ORACLE_CHARACTERSET=AL32UTF8 \ oracle/database:23.2.0-free
Connection Test
TOAD
Mit nachfolgenden Einstellungen konnte ich jeweils eine Verbindung aufbauen:
Java
Auf der Seite für JDBC Download von Oracle können wir sehen, das der OJDBC11-Treiber für JDK17 zertifiziert ist:
Anstelle des direkten Downloads kann man auch Maven verwenden, dort wird allerdings Kompatibilität nur bis JDK15 angegeben:
Ich vertraue da mehr der Oracle Seite und werde den Treiber verwenden und das Java Projekt mit JDK17 konfigurieren.
Testprojekt
Die pom.xml des Test Projektes:
4.0.0 deringo testproject 0.0.1-SNAPSHOT Test Project Projekt zum Testen von Sachen 17 UTF-8 com.oracle.database.jdbc ojdbc11 23.2.0.0 org.apache.maven.plugins maven-compiler-plugin 3.11.0 ${java.version}
Die Test Klasse, basierend auf dem Code-Snippet von Oracle:
package deringo.testproject; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import oracle.jdbc.datasource.impl.OracleDataSource; public class TestMain { public static void main(String[] args) throws Exception { OracleDataSource ods = new OracleDataSource(); ods.setURL("jdbc:oracle:thin:@localhost:1521/FREEPDB1"); // jdbc:oracle:thin@[hostname]:[port]/[DB service name] ods.setUser("PDBADMIN"); ods.setPassword("ingo5Password"); Connection conn = ods.getConnection(); PreparedStatement stmt = conn.prepareStatement("SELECT 'Hello World!' FROM dual"); ResultSet rslt = stmt.executeQuery(); while (rslt.next()) { System.out.println(rslt.getString(1)); } } }
Nach dem Starten des Programmes lautet die Ausgabe auf der Console dann auch "Hello World!".