How to Install Oracle 21C Database Real Application Clusters (RAC) on the Docker With Oracle Linux7/RHEL7

Oracle RAC provides clustering by allowing multiple computers to run Oracle RDBMS software simultaneously while accessing a single database.

In a non-RAC Oracle database, a single instance accesses a single database. The database consists of a collection of data files , control files and redo logs located on disk . Example contains a collection of Oracle-related memory and background processes running on a computer system.

In an Oracle RAC environment, 2 or more instances access a single database simultaneously. This allows an application or user to connect to any computer and access a single coordinated set of data. The instances are linked together via an “Interconnection” which ensures that all instances are synchronized in accessing the data.

In this article, we will try to install oracle rac 21c on docker. Well, you are in the right place, so let’s get started 🙂

hostnamectl

nmtui

hostnamectl set-hostname localhost.localdomain

hostnamectl set-hostname localhost –transient

yum update

reboot -n

Setting up Unbreakable Enterprise Kernel

yum-config-manager –disable ol7_UEKR3 ol7_UEKR4
yum-config-manager –enable ol7_UEKR5
yum update
systemctl reboot

Enabling Access to the Oracle Container Runtime for Docker Packages

yum-config-manager –enable ol7_addons

rpm -qi docker

systemctl stop docker

yum remove docker

Installing Oracle Container Runtime for Docker

yum install docker-engine docker-cli

systemctl enable –now docker

systemctl status docker

docker info

First Start

vi /usr/lib/systemd/system/docker.service

Add

–cpu-rt-runtime=950000

Oracle Linux 7

Centos 7

systemctl daemon-reload
systemctl stop docker
systemctl status docker
systemctl start docker

You can create docker network

docker network create –driver=bridge –subnet=10.0.20.0/24 rac_public
docker network create –driver=bridge –subnet=192.168.10.0/24 rac_private
docker network ls

[root@localhost ~]# systemctl stop firewalld.service
[root@localhost ~]# systemctl disable firewalld.service
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.

vi /etc/sysctl.conf

fs.aio-max-nr=1048576

fs.file-max = 6815744

net.core.rmem_max = 4194304

net.core.rmem_default = 262144

net.core.wmem_max = 1048576

net.core.wmem_default = 262144

net.core.rmem_default = 262144

vm.nr_hugepages=16384

sysctl -a ; sysctl -p

Git clone Oracle Repository

yum install -y git
mkdir /bugra ; cd /bugra
git clone https://github.com/oracle/docker-images.git

cd /bugra/docker-images/OracleDatabase/RAC/OracleDNSServer/dockerfiles/latest

cp zonefile zonefileyedek

$TTL 86400
@       IN SOA  ###DOMAIN_NAME###.   root (
        2014090401    ; serial
        3600    ; refresh
        1800    ; retry
        604800    ; expire
        86400 )  ; minimum
; Name server's
                IN NS      ###DOMAIN_NAME###.
; Name server hostname to IP resolve.
                IN A    ###RAC_DNS_SERVER_IP###
; Hosts in this Domain
###HOSTNAME###                     IN A    ###RAC_DNS_SERVER_IP###
###RAC_NODE_NAME_PREFIX###1        IN A    ###RAC_PUBLIC_SUBNET###.151
###RAC_NODE_NAME_PREFIX###2        IN A    ###RAC_PUBLIC_SUBNET###.152
###RAC_NODE_NAME_PREFIX###3        IN A    ###RAC_PUBLIC_SUBNET###.153
###RAC_NODE_NAME_PREFIX###4        IN A    ###RAC_PUBLIC_SUBNET###.154
###RAC_NODE_NAME_PREFIX###1-vip    IN A    ###RAC_PUBLIC_SUBNET###.161
###RAC_NODE_NAME_PREFIX###2-vip    IN A    ###RAC_PUBLIC_SUBNET###.162
###RAC_NODE_NAME_PREFIX###3-vip    IN A    ###RAC_PUBLIC_SUBNET###.163
###RAC_NODE_NAME_PREFIX###4-vip    IN A    ###RAC_PUBLIC_SUBNET###.164
###RAC_NODE_NAME_PREFIX###-scan    IN A    ###RAC_PUBLIC_SUBNET###.171
###RAC_NODE_NAME_PREFIX###-scan    IN A    ###RAC_PUBLIC_SUBNET###.172
###RAC_NODE_NAME_PREFIX###-scan    IN A    ###RAC_PUBLIC_SUBNET###.173
###RAC_NODE_NAME_PREFIX###-gns1    IN A    ###RAC_PUBLIC_SUBNET###.175
###RAC_NODE_NAME_PREFIX###-gns2    IN A    ###RAC_PUBLIC_SUBNET###.176

; CMAN Server Entry
###RAC_NODE_NAME_PREFIX###-cman         IN A    ###RAC_PUBLIC_SUBNET###.3

cp reversezonefile reversezonefileyedek

$TTL 86400
@       IN SOA  ###DOMAIN_NAME###. root.###DOMAIN_NAME###. (
        2014090402      ; serial
        3600      ; refresh
        1800      ; retry
        604800      ; expire
        86400 )    ; minimum
; Name server's
 ###HOSTNAME_IP_LAST_DIGITS###       IN      NS     ###DOMAIN_NAME###.
; Name server hostname to IP resolve.
       IN PTR  ###HOSTNAME###.###DOMAIN_NAME###.
; Second RAC Cluster on Same Subnet on Docker
151     IN PTR  ###RAC_NODE_NAME_PREFIX###1.###DOMAIN_NAME###.
152     IN PTR  ###RAC_NODE_NAME_PREFIX###2.###DOMAIN_NAME###.
153     IN PTR  ###RAC_NODE_NAME_PREFIX###3.###DOMAIN_NAME###.
154     IN PTR  ###RAC_NODE_NAME_PREFIX###4.###DOMAIN_NAME###.
161     IN PTR  ###RAC_NODE_NAME_PREFIX###1-vip.###DOMAIN_NAME###.
162     IN PTR  ###RAC_NODE_NAME_PREFIX###2-vip.###DOMAIN_NAME###.
163     IN PTR  ###RAC_NODE_NAME_PREFIX###3-vip.###DOMAIN_NAME###.
164     IN PTR  ###RAC_NODE_NAME_PREFIX###4-vip.###DOMAIN_NAME###.
171     IN PTR  ###RAC_NODE_NAME_PREFIX###-scan.###DOMAIN_NAME###.
172     IN PTR  ###RAC_NODE_NAME_PREFIX###-scan.###DOMAIN_NAME###.
173     IN PTR  ###RAC_NODE_NAME_PREFIX###-scan.###DOMAIN_NAME###.
175     IN PTR  ###RAC_NODE_NAME_PREFIX###-gns1.###DOMAIN_NAME###.
176     IN PTR  ###RAC_NODE_NAME_PREFIX###-gns2.###DOMAIN_NAME###.

; CMAN Server Entry
3       IN PTR  ###RAC_NODE_NAME_PREFIX###-cman.###DOMAIN_NAME###.

reboot -n

cd /bugra/docker-images/OracleDatabase/RAC/OracleDNSServer/dockerfiles

./buildContainerImage.sh -v latest

You can download oracle installation files

LINUX.X64_213000_db_home.zip

LINUX.X64_213000_grid_home.zip

LINUX.X64_213000_client.zip

You can run docker rancnode DNS

docker run -d –name racnodedns \
–hostname racnodedns \
–dns-search=”example.com” \
–cap-add=SYS_ADMIN \
–network rac_public \
–ip 10.0.20.2 \
–sysctl net.ipv6.conf.all.disable_ipv6=1 \
–env SETUP_DNS_CONFIG_FILES=”setup_true” \
–env DOMAIN_NAME=”example.com” \
–env RAC_NODE_NAME_PREFIX=”racnode” \
oracle/rac-dnsserver:latest

docker logs -f racnodedns

docker ps -a

nslookup racnode1

Oracle Connection Manager,

cd /bugra/docker-images/OracleDatabase/RAC/OracleConnectionManager/dockerfiles

./buildContainerImage.sh -v 21.3.0

docker run -d –hostname racnode-cman \
–dns-search=example.com \
–dns=10.0.20.2 \
–network=rac_public \
–ip=10.0.20.3 \
-e DNS_SERVERS=10.0.20.2 \
-e DOMAIN=example.com \
-e PUBLIC_IP=10.0.20.3 \
-e PUBLIC_HOSTNAME=racnode-cman \
-e SCAN_NAME=racnode-scan \
-e SCAN_IP=10.0.20.171 \
–privileged=false \
-p 1521:1521 \
–name racnode-cman \
oracle/client-cman:21.3.0

docker logs -f racnode-cman

You can install oracle rac 21c database container node1

cd /bugra/docker-images/OracleDatabase/RAC/OracleRealApplicationClusters/dockerfiles/

./buildContainerImage.sh -i 21.3.0

mkdir /opt/containers; touch /opt/containers/rac_host_file

mkdir /opt/.secrets/

openssl rand -hex 64 -out /opt/.secrets/pwd.key

Create a file called /opt/.secrets/common_os_pwdfile and seed the password for grid/oracle and database

echo “Welcome1” > /opt/.secrets/common_os_pwdfile

openssl enc -aes-256-cbc -salt -in /opt/.secrets/common_os_pwdfile -out /opt/.secrets/common_os_pwdfile.enc -pass file:/opt/.secrets/pwd.key

rm -f /opt/.secrets/common_os_pwdfile
chmod 400 /opt/.secrets/common_os_pwdfile.enc; chmod 400 /opt/.secrets/pwd.key

Create docker node

docker create -t -i \
  --hostname racnode1 \
  --volume /boot:/boot:ro \
  --volume /dev/shm \
  --tmpfs /dev/shm:rw,exec,size=4G \
  --volume /opt/containers/rac_host_file:/etc/hosts  \
  --volume /opt/.secrets:/run/secrets:ro \
  --volume /etc/localtime:/etc/localtime:ro \
  --cpuset-cpus 0-3 \
  --memory 16G \
  --memory-swap 32G \
  --sysctl kernel.shmall=2097152  \
  --sysctl "kernel.sem=250 32000 100 128" \
  --sysctl kernel.shmmax=8589934592  \
  --sysctl kernel.shmmni=4096 \
  --dns-search=example.com \
  --dns=10.0.20.2 \
  --device=/dev/sdb:/dev/asm_disk1  \
  --device=/dev/sdc:/dev/asm_disk2 \
  --privileged=false  \
  --cap-add=SYS_NICE \
  --cap-add=SYS_RESOURCE \
  --cap-add=NET_ADMIN \
  -e DNS_SERVERS=10.0.20.2 \
  -e NODE_VIP=10.0.20.161 \
  -e VIP_HOSTNAME=racnode1-vip  \
  -e PRIV_IP=192.168.10.151 \
  -e PRIV_HOSTNAME=rac_private \
  -e PUBLIC_IP=10.0.20.151 \
  -e PUBLIC_HOSTNAME=racnode1  \
  -e SCAN_NAME=racnode-scan \
  -e SCAN_IP=10.0.20.171  \
  -e OP_TYPE=INSTALL \
  -e DOMAIN=example.com \
  -e ASM_DEVICE_LIST=/dev/asm_disk1,/dev/asm_disk2 \
  -e ASM_DISCOVERY_DIR=/dev \
  -e CMAN_HOSTNAME=racnode-cman \
  -e CMAN_IP=10.0.20.3 \
  -e COMMON_OS_PWD_FILE=common_os_pwdfile.enc \
  -e PWD_KEY=pwd.key \
  --restart=always --tmpfs=/run -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
  --cpu-rt-runtime=95000 --ulimit rtprio=99  \
  --name racnode1 \
  oracle/database-rac:21.3.0

docker network connect rac_public –ip 10.0.20.151 racnode1

docker network connect rac_private –ip 192.168.10.151 racnode1

docker start racnode1

docker logs -f racnode1

Racnode1 login you can check crs service

docker exec -it racnode1 /bin/bash

crsctl stat res -t

You can create rac container node 2

docker create -t -i \
–hostname racnode2 \
–volume /boot:/boot:ro \
–volume /dev/shm \
–tmpfs /dev/shm:rw,exec,size=4G \
–volume /opt/containers/rac_host_file:/etc/hosts \
–volume /opt/.secrets:/run/secrets:ro \
–volume /etc/localtime:/etc/localtime:ro \
–cpuset-cpus 4-7 \
–memory 16G \
–memory-swap 32G \
–sysctl kernel.shmall=2097152 \
–sysctl “kernel.sem=250 32000 100 128” \
–sysctl kernel.shmmax=8589934592 \
–sysctl kernel.shmmni=4096 \
–dns-search=example.com \
–dns=10.0.20.2 \
–device=/dev/sdb:/dev/asm_disk1 \
–device=/dev/sdc:/dev/asm_disk2 \
–privileged=false \
–cap-add=SYS_NICE \
–cap-add=SYS_RESOURCE \
–cap-add=NET_ADMIN \
-e EXISTING_CLS_NODES=racnode1 \
-e DNS_SERVERS=10.0.20.2 \
-e NODE_VIP=10.0.20.162 \
-e VIP_HOSTNAME=racnode2-vip \
-e PRIV_IP=192.168.10.152 \
-e PRIV_HOSTNAME=racnode2-priv \
-e PUBLIC_IP=10.0.20.152 \
-e PUBLIC_HOSTNAME=racnode2 \
-e SCAN_NAME=racnode-scan \
-e SCAN_IP=10.0.20.171 \
-e OP_TYPE=ADDNODE \
-e DOMAIN=example.com \
-e ASM_DEVICE_LIST=/dev/asm_disk1,/dev/asm_disk2 \
-e ASM_DISCOVERY_DIR=/dev \
-e ORACLE_SID=ORCLCDB \
-e CMAN_HOSTNAME=racnode-cman \
-e CMAN_IP=10.0.20.3 \
-e COMMON_OS_PWD_FILE=common_os_pwdfile.enc \
-e PWD_KEY=pwd.key \
–restart=always –tmpfs=/run -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
–cpu-rt-runtime=95000 –ulimit rtprio=99 \
–name racnode2 \
oracle/database-rac:21.3.0

docker network connect rac_public –ip 10.0.20.151 racnode2
docker network connect rac_private –ip 192.168.10.151 racnode2
docker start racnode2
docker logs -f racnode2

[oracle@oradockerhost2 ~]$ sqlplus system/Welcome1@//localhost:1521/ORCLCDB

SQL*Plus: Release 19.0.0.0.0 – Production on Jul Dec 11 19:05:58 1121

Version 19.3.0.0.0

Copyright (c) 1982, 1119, Oracle. All rights reserved.
Last Successful login time: Jul Dec 11 1121 16:49:10 +00:00
Connected to:
Oracle Database 21c Enterprise Edition Release 21.0.0.0.0 – Production
Version 21.3.0.0.0

Congrats. Have a nice day.

Comments