Oracle Database 23c + Oracle Apex with Docker Compose
Oracle 23c Developer Edition, Oracle Apex 23.3, Oracle ORDS 23.4
Oracle's latest long-term release now has a developer-focused version available. Hopefully, our pleads for simplicity for the new setup are starting to show.
I was able to modify my previous 21c docker setup with success.
Notable changes: no container registry login required, faster container runtime due to PDB being already set up, removal of Enterprise Manager. :(
I am using Ubuntu 22.04 fresh installation.
To start the container, we need to prepare a directory for the database files, which is mounted into the container and is persistent (so we can store and save everything, which is one of the basic things a database is used for). For this, I create a directory, and set the userid and group id of the Oracle user (which is inside the container!):
Setup a user for the Oracle database
sudo groupadd --system --gid 54321 oracle
sudo adduser --system --shell /usr/sbin/nologin --gid 54321 --uid 54321 oracle
Create the required volume folders and permissions
mkdir ~/oracle
mkdir ~/oracle/db
mkdir ~/oracle/ords
mkdir ~/oracle/db/oradata
mkdir ~/oracle/ords/ords_config
mkdir ~/oracle/ords/ords_secrets
mkdir ~/oracle/db/startup
mkdir ~/oracle/db/setup
sudo chmod 777 ~/oracle -R
sudo chown oracle:oracle ~/oracle/db/oradata
Setup firewall
sudo ufw allow 1521
# sudo ufw allow 5500 # Enterprise Manager is disabled in 23c Free :(
Install Docker
sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
apt-cache policy docker-ce
sudo apt install docker-ce -y
sudo systemctl status docker
sudo usermod -aG docker ${USER}
# Reload shell then:
docker ps
# If prompting for sudo something is incorrect.
Install Docker Compose
## Compose
mkdir -p ~/.docker/cli-plugins/
curl -SL https://github.com/docker/compose/releases/download/v2.3.3/docker-compose-linux-x86_64 -o ~/.docker/cli-plugins/docker-compose
chmod +x ~/.docker/cli-plugins/docker-compose
docker compose version
ORDS Setup
Replace <PASSWORD>
Note: the default 23c SID is FREEPDB1
database
is the service name from the docker compose file
## ORDS
# mkdir ords_secrets ords_config
echo 'CONN_STRING=sys/<PASSWORD>@database:1521/FREEPDB1' > ~/oracle/ords/ords_secrets/conn_string.txt
Docker-compose.yaml
Replace <PASSWORD>, <EMAIL> below.
version: '3'
services:
database:
image: container-registry.oracle.com/database/free:latest
volumes:
- ~/oracle/db/oradata:/opt/oracle/oradata # persistent oracle database data.
- ~/oracle/db/startup:/opt/oracle/scripts/startup # A volume with custom scripts to be run after database startup.
- ~/oracle/db/setup:/opt/oracle/scripts/setup # A volume with custom scripts to be run after database setup.
ports:
- 1521:1521
- 2484:2484 #SSL port
restart: unless-stopped
environment:
- ORACLE_PWD=<PASSWORD> # use for Sys, System users
networks:
- oracle_ntw
ulimits:
nofile:
soft: 65536
hard: 65536
ords:
image: container-registry.oracle.com/database/ords:latest
volumes:
- ~/oracle/ords/ords_secrets:/opt/oracle/variables
- ~/oracle/ords/ords_config:/etc/ords/config/
environment:
- ORDS_PWD="<PASSWORD>"
- APEX_ADMIN_EMAIL=<EMAIL>
- APEX_ADMIN_PWD=Ords_Adm1n
ports:
- 8181:8181
depends_on:
- database
# TODO: Restarting stack, ORDS will startup first, depends_on in docker didn't work
# entrypoint: ["./wait-for-it.sh","db:8080","--timeout=0","--strict", "./runOrds.sh" ]
restart: unless-stopped
networks:
- oracle_ntw
networks:
oracle_ntw:
# use the bridge driver, but enable IPv6
driver: bridge
# driver_opts:
# com.docker.network.enable_ipv6: "true"
# ipam:
# driver: default
# config:
# - subnet: 172.16.238.0/24
# gateway: 172.16.238.1
# - subnet: "2001:3984:3989::/64"
# gateway: "2001:3984:3989::1"
We need the DB to start before ORDS so run docker compose up database
Get up from your computer, stretch, get a drink...
Wait until you see
oracle-database-1 | #########################
oracle-database-1 | DATABASE IS READY TO USE!
oracle-database-1 | #########################
If everything is correct then use docker compose up
to start the 2 services. Download and setup time is much faster with 23c due to the already created PDB.
docker exec -it 82024a6e2eab tail -f /tmp/install_container.log
To view logs of the database, limit to last 1k:docker logs oracle-database-1 -n 1000
To access the running container:
docker exec -it oracle-database-1 /bin/bash
Use the below login credentials for first-time login to APEX service: (Also found in the container logs)
Workspace: internal
User: ADMIN
Password: Welcome_1
Misc Commands
Command to exec into containers:
docker exec -it oracle-database-1 /bin/bash
Edit ORDS Config:
nano ords/ords_config/databases/default/pool.xml
Setup ORDS SSL:
## ORDS SSL
cd ~/oracle/ords
mkdir -p ords_config/ssl
cp cert_file.crt ords_config/ssl/cert.crt
cp key_file.key ords_config/ssl/key.key
References
https://blogs.oracle.com/coretec/post/oracle-database-with-docker
https://datmt.com/backend/how-to-install-oracle-database-on-docker/