Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Run Oracle Databases in Containers

Run Oracle Databases in Containers

Avatar for Seán Scott

Seán Scott PRO

March 12, 2024

More Decks by Seán Scott

Other Decks in Technology

Transcript

  1. Run Oracle Database in Containers Sean Scott Oracle ACE Director

    Managing Principal Consultant @oraclesean linkedin.com/in/soscott/ [email protected] @ViscosityNA www.viscosityna.com
  2. DATABASE RELIABILITY ENGINEERING ⁘ DEVOPS & AUTOMATION HIGH AVAILABILITY ⁘

    BUSINESS CONTINUITY ⁘ DISASTER RECOVERY MODERNIZATION ⁘ OBSERVABILITY ⁘ ENGINEERED SYSTEMS AutoUpgrade ⁘ Zero Downtime Migrations ⁘ Patching Real Application Clusters ⁘ Data Guard ⁘ Sharding Docker/Containers ⁘ Terraform ⁘ Ansible Exadata ⁘ Oracle Database Appliance AHF ⁘ TFA ⁘ GIMR ⁘ CHA Sean Scott Oracle ACE Director Managing Principal Consultant @oraclesean linkedin.com/in/soscott/ [email protected] @ViscosityNA www.viscosityna.com
  3. @ViscosityNA www.viscosityna.com Oracle on Docker Running Oracle Databases in Linux

    Containers Download a free sample chapter: https:/ /oraclesean.com
  4. @ViscosityNA www.viscosityna.com www.viscosityna.com @ViscosityNA Images are Infrastructure as Code •

    Manage through Version Control • Reliable and repeatable Images are Artifacts • Portable • Distributable
  5. @ViscosityNA www.viscosityna.com www.viscosityna.com @ViscosityNA Images built on <MY OS> work

    on: • Windows • Mac • Linux • Docker • Podman • Compose • Kubernetes • OCI • Azure • AWS • GCP
  6. @ViscosityNA www.viscosityna.com www.viscosityna.com @ViscosityNA Eliminate dependencies Develop SQL, PL/SQL, scripts

    Hack, experiment, learn Performance tuning Test without infrastructure Validate patches, upgrades Build labs, training environments Run Oracle on Docker to…
  7. @ViscosityNA www.viscosityna.com www.viscosityna.com @ViscosityNA Vanilla databases Multitenant/Legacy Data Guard Far

    Sync Real Application Clusters Sharding …and much, much more! What’s possible?
  8. @ViscosityNA www.viscosityna.com Chose a version and architecture # 23c Always

    Free (Windows, Intel Mac/Linux): IMAGE_NAME=container-registry.oracle.com/database/free:latest # 19c on Intel (Windows, Intel Mac/Linux): IMAGE_NAME=container-registry.oracle.com/database/enterprise:19.3.0.0 docker login container-registry.oracle.com # 19c on ARM (M1/M2 Mac, Linux on ARM): IMAGE_NAME=container-registry.oracle.com/database/enterprise:19.19.0.0 docker login container-registry.oracle.com
  9. @ViscosityNA www.viscosityna.com Run a "quick and dirty" database docker run

    -d \ --name my_db \ ${IMAGE_NAME} docker logs -f my_db
  10. @ViscosityNA www.viscosityna.com Set up the environment (Windows/Linux) # Add the

    oinstall group and oracle user: sudo groupadd -g 54321 oinstall sudo useradd -u 54321 -g oinstall oracle # Add the current user to the oinstall group: sudo usermod -a -G oinstall $USER
  11. @ViscosityNA www.viscosityna.com Create a database directory # Set the base

    database directory path (Windows/Linux): ORADATA=/oradata sudo mkdir -p ${ORADATA} sudo chown -R oracle:oinstall ${ORADATA} sudo chmod 775 ${ORADATA} # Set the base database directory path (Mac): ORADATA=~/oradata mkdir -p ${ORADATA}
  12. @ViscosityNA www.viscosityna.com Create an NFS-like scripts directory # Set the

    base database directory path (Windows/Linux): sudo mkdir -p ${ORADATA}/scripts sudo chown -R oracle:oinstall ${ORADATA}/scripts # Set the base database directory path (Mac): mkdir -p ${ORADATA}/scripts
  13. @ViscosityNA www.viscosityna.com Set variables # Set the container name: CONTAINER_NAME=ORCL

    # Set the database SID and PDB name (not needed for 23c): ORACLE_SID=ORCL ORACLE_PDB=ORCLPDB
  14. @ViscosityNA www.viscosityna.com Create directories (Windows/Linux) # Create directories for audit,

    data, and diagnostics: for dir in audit data diag do sudo mkdir -p ${ORADATA}/${CONTAINER_NAME}/${dir} sudo chown -R oracle:oinstall ${ORADATA}/${CONTAINER_NAME}/${dir} # Clean up existing files: sudo rm -fr ${ORADATA}/${CONTAINER_NAME}/${dir}/* # Create Docker-managed volumes docker volume rm ${CONTAINER_NAME}_${dir} 2>/dev/null docker volume create --opt type=none --opt o=bind \ --opt device=${ORADATA}/${CONTAINER_NAME}/${dir} \ ${CONTAINER_NAME}_${dir} done
  15. @ViscosityNA www.viscosityna.com Create directories (Mac) # Create directories for audit,

    data, and diagnostics: for dir in audit data diag do mkdir -p ${ORADATA}/${CONTAINER_NAME}/${dir} # Clean up existing files: rm -fr ${ORADATA}/${CONTAINER_NAME}/${dir}/* # Create Docker-managed volumes docker volume rm ${CONTAINER_NAME}_${dir} 2>/dev/null docker volume create --opt type=none --opt o=bind \ --opt device=${ORADATA}/${CONTAINER_NAME}/${dir} \ ${CONTAINER_NAME}_${dir} done
  16. @ViscosityNA www.viscosityna.com Run a "quick and dirty" database docker run

    -d \ --name my_db \ ${IMAGE_NAME} docker logs -f my_db
  17. @ViscosityNA www.viscosityna.com A useful docker run command for an Oracle

    DB docker rm -f ${CONTAINER_NAME} 2>/dev/null docker run -d \ --name ${CONTAINER_NAME} \ --volume ${CONTAINER_NAME}_data:/opt/oracle/oradata \ --volume ${CONTAINER_NAME}_diag:/opt/oracle/diag \ --volume ${CONTAINER_NAME}_audit:/opt/oracle/admin \ --volume ${ORADATA}/scripts:/scripts \ -e ORACLE_SID=${ORACLE_SID} \ -e ORACLE_PDB=${ORACLE_PDB} \ -p 1521:1521 \ ${IMAGE_NAME} docker logs -f ${CONTAINER_NAME}
  18. @ViscosityNA www.viscosityna.com A useful docker run command for 23c Free

    Edition docker rm -f ${CONTAINER_NAME} 2>/dev/null docker run -d \ --name ${CONTAINER_NAME} \ --volume ${CONTAINER_NAME}_data:/opt/oracle/oradata \ --volume ${CONTAINER_NAME}_diag:/opt/oracle/diag \ --volume ${CONTAINER_NAME}_audit:/opt/oracle/admin \ --volume ${ORADATA}/scripts:/scripts \ -p 1521:1521 \ ${IMAGE_NAME} docker logs -f ${CONTAINER_NAME}
  19. @ViscosityNA www.viscosityna.com Customize Database Creation docker run ... \ -e

    ORACLE_PWD=<password> -e ORACLE_SID=<sid> -e ORACLE_PDB=<pdbname> -e ORACLE_CHARACTERSET=<characterset> -tz=<timezone>
  20. @ViscosityNA www.viscosityna.com www.viscosityna.com @ViscosityNA ├── ORCLCDB │ ├── ORCLPDB1 │

    │ ├── … │ ├── control01.ctl │ ├── pdbseed │ │ ├── … │ ├── redo01.log │ ├── redo02.log │ ├── redo03.log │ ├── sysaux01.dbf │ ├── system01.dbf │ ├── temp01.dbf │ ├── undotbs01.dbf │ └── users01.dbf └── dbconfig └── ORCLCDB ├── listener.ora ├── orapwORCLCDB ├── oratab ├── spfileORCLCDB.ora ├── sqlnet.ora └── tnsnames.ora
  21. @ViscosityNA www.viscosityna.com www.viscosityna.com @ViscosityNA ├── ORCLCDB │ ├── ORCLPDB1 │

    │ ├── … │ ├── control01.ctl │ ├── pdbseed │ │ ├── … │ ├── redo01.log │ ├── redo02.log │ ├── redo03.log │ ├── sysaux01.dbf │ ├── system01.dbf │ ├── temp01.dbf │ ├── undotbs01.dbf │ └── users01.dbf └── dbconfig └── ORCLCDB ├── listener.ora ├── orapwORCLCDB ├── oratab ├── spfileORCLCDB.ora ├── sqlnet.ora └── tnsnames.ora
  22. @ViscosityNA www.viscosityna.com www.viscosityna.com @ViscosityNA Mapping the Data Volume docker run

    -d ... \ --volume ${CONTAINER_NAME}_data:/opt/oracle/oradata \ --volume ${CONTAINER_NAME}_diag:/opt/oracle/diag \ --volume ${CONTAINER_NAME}_audit:/opt/oracle/admin \ ... ${IMAGE_NAME} Database files are in the ${CONTAINER_NAME}_data volume directory; diagnostic files are in the ${CONTAINER_NAME}_diag volume directory; and audit files are in the ${CONTAINER_NAME}_audit volume directory.
  23. @ViscosityNA www.viscosityna.com www.viscosityna.com @ViscosityNA Which means... The entire database is

    saved under: ${ORADATA}/${CONTAINER_NAME}/data Incuding: • Data files • Temp files • Redo logs • Archive logs • TNS configurations • Wallets • /etc/oratab • pfile/spfile
  24. @ViscosityNA www.viscosityna.com Create directories (Windows/Linux) # Create directories for audit,

    data, and diagnostics: for dir in audit data diag do sudo mkdir -p ${ORADATA}/${CONTAINER_NAME}/${dir} sudo chown -R oracle:oinstall ${ORADATA}/${CONTAINER_NAME}/${dir} # Clean up existing files: sudo rm -fr ${ORADATA}/${CONTAINER_NAME}/${dir}/* # Create Docker-managed volumes docker volume rm ${CONTAINER_NAME}_${dir} 2>/dev/null docker volume create --opt type=none --opt o=bind \ --opt device=${ORADATA}/${CONTAINER_NAME}/${dir} \ ${CONTAINER_NAME}_${dir} done
  25. @ViscosityNA www.viscosityna.com Create directories (Mac) # Create directories for audit,

    data, and diagnostics: for dir in audit data diag do mkdir -p ${ORADATA}/${CONTAINER_NAME}/${dir} # Clean up existing files: rm -fr ${ORADATA}/${CONTAINER_NAME}/${dir}/* # Create Docker-managed volumes docker volume rm ${CONTAINER_NAME}_${dir} 2>/dev/null docker volume create --opt type=none --opt o=bind \ --opt device=${ORADATA}/${CONTAINER_NAME}/${dir} \ ${CONTAINER_NAME}_${dir} done
  26. @ViscosityNA www.viscosityna.com Copy the [g]old data from source to target

    # (Windows/Linux): sudo cp -rp ${ORADATA}/${SOURCE_CONTAINER}/data/* ${ORADATA}/${CONTAINER_NAME}/data/ # (Mac): cp -rp ${ORADATA}/${SOURCE_CONTAINER}/data/* ${ORADATA}/${CONTAINER_NAME}/data/
  27. @ViscosityNA www.viscosityna.com Instant database! docker rm -f ${CONTAINER_NAME} 2>/dev/null docker

    run -d \ --name ${CONTAINER_NAME} \ --volume ${CONTAINER_NAME}_data:/opt/oracle/oradata \ --volume ${CONTAINER_NAME}_diag:/opt/oracle/diag \ --volume ${CONTAINER_NAME}_audit:/opt/oracle/admin \ --volume ${ORADATA}/scripts:/scripts \ -e ORACLE_SID=${ORACLE_SID} \ -e ORACLE_PDB=${ORACLE_PDB} \ -p 1522:1521 \ ${IMAGE_NAME} docker logs -f $CONTAINER_NAME
  28. @ViscosityNA www.viscosityna.com Resources • Download Docker Desktop: https:/ /www.docker.com/products/docker-desktop/ •

    Oracle Container Registry: https:/ /container-registry.oracle.com • Oracle Docker Repository: https:/ /github.com/oracle/docker-images • Sean's Cloud Native Oracle Database Repository: https:/ /github.com/oraclesean/cloud-native-oracle