Oracle Database 23c + Oracle Apex with Docker Compose

Oracle 23c Developer Edition, Oracle Apex 23.3, Oracle ORDS 23.4

Oracle Database 23c + Oracle Apex with Docker Compose

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://docs.oracle.com/en/database/oracle/oracle-database/21/deeck/index.html#GUID-375BBD63-755D-4477-AE2A-13384B7B1631

https://docs.oracle.com/en/operating-systems/oracle-linux/docker/docker-InstallingOracleContainerRuntimeforDocker.html#docker-install-storage-driver

https://datmt.com/backend/how-to-install-oracle-database-on-docker/

https://docs.oracle.com/en/operating-systems/oracle-linux/docker/docker-SecurityRecommendations.html#docker-security-images