[Oracle Cloud] OCI Compute 上に Docker で Oracle Database 19c の 4 Node RAC 環境を構築する

# 1. はじめに
Docker で Oracle Database のシングルインスタンス環境を構築する記事は見かけますが、RAC (Real Application Clusters) 環境を構築する記事はそんなに無さそうだったので記事にしたいと思い、改めて手順確認の意味も込めて構築してみたいと思います。

今回は Oracle Cloud Infrastructure (以降、OCI) で作成した一つの Compute 上に、 Docker で 4つのコンテナを作成し、4 Node の RAC 環境を構築します。 もちろん、Node 数は調整可能です。

### 1-1. 注意
- ~~Docker で 構成された Oracle Database は検証環境や開発環境でのみ利用できます。本番環境での利用はできませんのでご注意ください。~~　
  Oracle Database 21c(21.3)以降では本番環境での利用もできるようです。
参考 : [Support Policy for Oracle Database Container Images on Kubernetes Clusters (Doc ID 2789626.1)](https://support.oracle.com/epmos/faces/DocumentDisplay?id=2789626.1)

- 今回の環境とは違いますが、本来 OCI で RAC 構成がサポートされるのは DBCS, ExaCS, ExaCCといったサービスです。複数の Compute で RAC を構成することはできませんのでご注意ください。

### 1-2. 環境
- Oracle Cloud Infrastructure Compute
- Oracle Linux 7.9
- Oracle Database 19c (19.3)
- Oracle Database 19c Grid Infrastructure（19.3）
- Docker

### 1-3. 参考ドキュメント
Oracle 公式 Github に記載の手順に従って構築していきます。

[Oracle RAC Database on Docker](https://github.com/oracle/docker-images/tree/master/OracleDatabase/RAC/OracleRealApplicationClusters)

# 2. Compute の作成
まずは OCI で Compute を作成していきます。
OCI Console の左上のハンバーガーメニューをクリックし、[コンピュート] - [インスタンス] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/4972a72a-8d28-beaa-bc88-65a12256fc1f.png)

インスタンスの作成をクリックします。
 ![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/5da91374-fee9-7696-d90d-36fe93d54bcb.png)

インスタンス名を入力してください。ADはどれを選択しても大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/1467bbff-d420-6a2a-302d-7c1469acf289.png)

イメージは Oracle Linux のデフォルトで選択されるバージョンとしました。
シェイプは今回 4 Node RAC とするので、なんとなく4コアくらい欲しいかなと思い VM.Standard2.4としました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/ef13aa5a-c704-b281-f907-208f0b54a00b.png)

ネットワーク(VCN)は事前に作成済みという前提です。今回はInternetから接続可能な Public Subnet に作成します。Internet 経由で接続するため、[パブリックIPアドレスの割当] も選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/173b24b9-230d-2c3e-6643-6bbb486477af.png)

SSHキーの追加はお好みの方法で構いません。今回は [SSHキー・ファイルの選択] で事前に作成していたSSHキーを登録しました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/e3c701d4-ab10-a896-790c-61b8f64ef286.png)

デフォルトだとブート・ボリュームが46GB程度しかなく、Docker で Oracle Database を構成するにはちょっと足りません。おそらく100GB程度あれば大丈夫ですが、今回は余裕を持って200GBとします。
なお、ここで指定するサイズは、Oracle Database の データファイルを格納する ASMディスク分の容量は含みません。ASM 分は後ほど追加しますので、一旦は考慮しなくて大丈夫です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/b23dfdd7-0da3-9c69-723b-2edd4b72b8b3.png)

各項目の入力を終えたら [作成] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/83a99ef1-1ad9-3663-a2f8-23f04f396ced.png)

インスタンスが [実行中] になったら作成完了です。
[パブリックIPアドレス] が表示されるので、このIPアドレスにSSHでログインします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/84464cd0-e781-3888-1c8f-3da5d8fae0af.png)

# 3. Compute にログイン
Teraterm等のSSHクライアントで、作成したComputeにログインします。
 - 接続先 : [パブリックIPアドレス]
 - ユーザ名 : opc
 - パスフレーズ : SSHキー作成時に指定していれば、ここでも同じものを指定
 - 秘密鍵 : Compute作成時に指定したSSH公開鍵と対になる秘密鍵を指定

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/413444c1-34a8-7695-0ab6-6bd60f7f5e68.png)

ログインできました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/832bc266-adbd-de96-330d-a3fbb0b4d3af.png)

# 4. Compute OS設定
Computeを作成したらまずやること、的なのがいくつかあるのでやっていきます。

### 4-1. タイムゾーンの変更
タイムゾーンを Asia/Tokyo に変更します。

    [opc@rac-instance01 ~]$ sudo timedatectl set-timezone Asia/Tokyo
    [opc@rac-instance01 ~]$ timedatectl
          Local time: Fri 2021-01-01 16:18:26 JST
      Universal time: Fri 2021-01-01 07:18:26 UTC
            RTC time: Fri 2021-01-01 07:18:27
           Time zone: Asia/Tokyo (JST, +0900)
         NTP enabled: yes
    NTP synchronized: yes
     RTC in local TZ: no
          DST active: n/a
    [opc@rac-instance01 ~]$

### 4-2. ロケールの変更
ロケールを ja_JP.utf8 に変更します。これはお好みです。

    [opc@rac-instance01 ~]$ sudo localectl set-locale LANG=ja_JP.utf8
    [opc@rac-instance01 ~]$ localectl
       System Locale: LANG=ja_JP.utf8
           VC Keymap: us
          X11 Layout: us
    [opc@rac-instance01 ~]$ cat /etc/locale.conf
    LANG=ja_JP.utf8
    [opc@rac-instance01 ~]$

### 4-3. ブート・ボリュームの拡張
Compute 作成の際に指定した 200GB は、デバイスとしては 200GB になっているのですが、ファイルシステムとしは変わっていないので、/ をマウントしている /dev/sda3 を拡張します。

まずは事前の状態の確認です。

    [opc@rac-instance01 ~]$ lsblk
    NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
    sda      8:0    0  200G  0 disk　　　　　　★200GBになっている
     -sda2   8:2    0    8G  0 part [SWAP]
     -sda3   8:3    0 38.4G  0 part /         ★約39GBしかない
     -sda1   8:1    0  200M  0 part /boot/efi

    [opc@rac-instance01 ~]$ df -h /
    ファイルシス   サイズ  使用  残り 使用% マウント位置
    /dev/sda3         39G   11G   29G   27% /   ★39GBしかない


拡張には、OCI ユーティリティ の oci-growfs を利用します。

__oci-growfs__
https://docs.oracle.com/ja-jp/iaas/Content/Compute/References/oci-growfs.htm
>インスタンスのルート・ファイルシステムを構成したサイズに拡張します。このコマンドはルートとして実行する必要があります。

oci-growfs を実行するだけでブート・ボリュームを拡張できるので非常に便利です。

    [opc@rac-instance01 ~]$ sudo /usr/libexec/oci-growfs
    CHANGE: partition=3 start=17188864 old: size=80486400 end=97675264 new: size=402241502 end=419430366
    Confirm? [y/n]y    ★ y を入力してEnter
    CHANGED: partition=3 start=17188864 old: size=80486400 end=97675264 new: size=402241502 end=419430366
    meta-data=/dev/sda3              isize=256    agcount=4, agsize=2515200 blks
             =                       sectsz=4096  attr=2, projid32bit=1
             =                       crc=0        finobt=0, sparse=0, rmapbt=0
             =                       reflink=0
    data     =                       bsize=4096   blocks=10060800, imaxpct=25
             =                       sunit=0      swidth=0 blks
    naming   =version 2              bsize=4096   ascii-ci=0, ftype=1
    log      =internal log           bsize=4096   blocks=4912, version=2
             =                       sectsz=4096  sunit=1 blks, lazy-count=1
    realtime =none                   extsz=4096   blocks=0, rtextents=0
    data blocks changed from 10060800 to 50280187

    [opc@rac-instance01 ~]$ lsblk
    NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
    sda      8:0    0   200G  0 disk
     -sda2   8:2    0     8G  0 part [SWAP]
     -sda3   8:3    0 191.8G  0 part /          ★残りすべての容量が割り当てられた
     -sda1   8:1    0   200M  0 part /boot/efi

    [opc@rac-instance01 ~]$ df -h /
    ファイルシス   サイズ  使用  残り 使用% マウント位置
    /dev/sda3        192G   11G  182G    6% /   ★残りすべての容量が割り当てられた


# 5. Compute Dockerホスト構築
Dockerホストとしての設定をしていきます。

### 5-1. yum アップデート
yum update しておきます。たぶん色々と更新するので時間かかります。

    [opc@rac-instance01 ~]$ sudo yum update

### 5-2. git インストール
Oracle 公式の Docker Image をクローンするため、gitをインストールします。 

    [opc@rac-instance01 ~]$ sudo yum install git


### 5-3. Docker イメージのクローン
Oracle の Docker イメージをクローンします。

    [opc@rac-instance01 ~]$ git clone https://github.com/oracle/docker-images.git
    Cloning into 'docker-images'...
    remote: Enumerating objects: 13371, done.
    remote: Total 13371 (delta 0), reused 0 (delta 0), pack-reused 13371
    Receiving objects: 100% (13371/13371), 9.75 MiB | 0 bytes/s, done.
    Resolving deltas: 100% (7857/7857), done.


### 5-4. Oracle Database ソフトウェアの準備
Oracle Database の ソフトウェアの zip ファイルを準備します。

__Oracle Database 19c (19.3)__
https://www.oracle.com/database/technologies/oracle19c-linux-downloads.html
※ [OTN ライセンス](https://www.oracle.com/jp/downloads/applications/software-download.html)の範囲内で利用してください。

普通にブラウザでダウンロードして SCP や FTP 等で Compute にアップロードしても良いのですが、それだと時間かかるし面倒なので、今回は直接 Compute 上でダウンロードします。といっても、ファイルのURL直接だとダウンロードできないので、ちょっと小細工します。

19.3 の Download のリンクをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/69d200bc-2031-c37f-7767-0f6fdaef38b4.png)


ライセンスのチェックを入れ、Download のボタンをクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/08a54ae9-12f6-f10e-afd6-e76d9b57752f.png)

ダウンロードが始まったら、すぐにブラウザ上で一時停止します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/ac5969a5-9d4f-e85b-9346-f04f3d59b673.png)

ブランザのダウンロードの画面を開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/39d476f9-c6e0-e6ce-59c9-288a2a7103b0.png)

対象のファイルのURLをコピーします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/e8a07b82-c7b0-5748-8807-e748692b98eb.png)

Compute 上で zip を配置する場所へ移動し、コピーしたURLで直接ダウンロードします。

    [opc@rac-instance01 ~]$ cd ~/docker-images/OracleDatabase/RAC/OracleRealApplicationClusters/dockerfiles/19.3.0/
    [opc@rac-instance01 19.3.0]$ curl -0 https://download.oracle.com/otn/linux/oracle19c/190000/LINUX.X64_193000_db_home.zip?AuthParam=xxxxxxxxxx_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx > LINUX.X64_193000_db_home.zip
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                     Dload  Upload   Total   Spent    Left  Speed
     58 2917M   58 1694M    0     0  75.0M      0  0:00:38  0:00:22  0:00:16 6193k


同様に、Grid Infrastructure の zip も同じ場所にダウンロードしてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/0271f726-51c0-0f5a-cc51-9f347839279c.png)


### 5-5. yum リポジトリの準備
1年ほど前に構築したときは OCI Compute のデフォルトイメージが Oracle Linux 7.7 だったのですが、その際は docker-engine インストールのために yum リポジトリの追加が必要でした。
今回、デフォルトイメージが Oracle Linux 7.9 になっており、必要なリポジトリがデフォルトで存在したので不要でしたが、念の為手順を記しておきます。

    [opc@rac-instance01 ~]$ cd /etc/yum.repos.d/
    [opc@rac-instance01 yum.repos.d]$ grep 'ol7_addons' *.repo
    oracle-linux-ol7.repo:[ol7_addons]            ★ol7_addons が存在する

ol7_addons を含むリポジトリファイルが存在すれば、当手順は不要です。SKIPしてください。
存在しない場合は以下の手順で追加してください。

    [opc@rac-instance01 yum.repos.d]$ sudo wget http://yum.oracle.com/public-yum-ol7.repo
    [opc@rac-instance01 yum.repos.d]$ vi public-yum-ol7.repo
    -------------------------
    [ol7_addons]
    name=Oracle Linux $releasever Add ons ($basearch)
    baseurl=http://yum.oracle.com/repo/OracleLinux/OL7/addons/$basearch/
    gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-oracle
    gpgcheck=1
    enabled=1 　　　 <---　★ここを0から1に変更する
    -------------------------

### 5-6. docker-engine インストール
docker-engine をインストールします。

    [opc@rac-instance01 ~]$ sudo yum install docker-engine

Docker を起動します。

    [opc@rac-instance01 ~]$ sudo systemctl start docker
    [opc@rac-instance01 ~]$ sudo systemctl status docker
    ● docker.service - Docker Application Container Engine
       Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
       Active: active (running) since 月 2021-01-04 19:45:07 JST; 3s ago

### 5-7. カーネルパラメータ設定
[公式 Github](https://github.com/oracle/docker-images/tree/master/OracleDatabase/RAC/OracleRealApplicationClusters) の手順通りにカーネルパラメータを追加します。

    [opc@rac-instance01 ~]$ sudo vi /etc/sysctl.conf
    ---- ★以下すべてを追記
    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
    ----
    [opc@rac-instance01 ~]$ sysctl -a
    [opc@rac-instance01 ~]$ sudo sysctl -p


### 5-8. Docker 起動設定
docker.service の起動設定をします。
/usr/lib/systemd/system/docker.service の ExecStart を以下の内容に置き換えます。

     [opc@rac-instance01 ~]$ sudo vi /usr/lib/systemd/system/docker.service
    ---
    ExecStart=/usr/bin/dockerd --cpu-rt-runtime=950000 --cpu-rt-period=1000000 --exec-opt=native.cgroupdriver=systemd
    ----

続いて、cgroup の設定を行います。
3つめは 95000 x node数 以上の値を入れます。今回は 4Node なので 95000 X 4 で
380000 ですが、余裕をもって 400000 とします。これをやっておかないと、後半のコンテナ起動でエラーが出て失敗しますので忘れずに設定しておきます。また、Dockerホストのサーバを再起動するとこの設定は消えてしまうので、ホストのサーバを起動するたびに設定されるようにしておくのがオススメです。

    [root@rac-instance01 opc]# echo 950000 > /sys/fs/cgroup/cpu/cpu.rt_runtime_us
    [root@rac-instance01 opc]# echo 1000000 > /sys/fs/cgroup/cpu/cpu.rt_period_us
    [root@rac-instance01 opc]# echo 400000 > /sys/fs/cgroup/cpu,cpuacct/system.slice/cpu.rt_runtime_us

ここまで設定ができましたら、Docker を再起動します。

    [opc@rac-instance01 ~]$ sudo systemctl daemon-reload
    [opc@rac-instance01 ~]$ sudo systemctl restart docker
    [opc@rac-instance01 ~]$ sudo systemctl enable docker
    Created symlink from /etc/systemd/system/multi-user.target.wants/docker.service to /usr/lib/systemd/system/docker.service.
    [opc@rac-instance01 ~]$ sudo systemctl status docker
    ● docker.service - Docker Application Container Engine
       Loaded: loaded (/usr/lib/systemd/system/docker.service; enabled; vendor preset: disabled)
       Active: active (running) since 水 2021-01-06 21:35:11 JST; 9s ago
         Docs: https://docs.docker.com
     Main PID: 11610 (dockerd)
       CGroup: /system.slice/docker.service
               mq11610 /usr/bin/dockerd --cpu-rt-runtime=950000 --cpu-rt-period=1000000 --exec-opt=native.cgroupdriver=systemd


# 6. Docker 構築
Docker の構築をしていきます。

### 6-1. インストールイメージの構築
Oracle RAC Database の Docker インストールイメージを構築します。

    [opc@rac-instance01 ~]$ cd ~/docker-images/OracleDatabase/RAC/OracleRealApplicationClusters/dockerfiles
    [opc@rac-instance01 dockerfiles]$ sudo ./buildDockerImage.sh -v 19.3.0
    Checking if required packages are present and valid...
    LINUX.X64_193000_grid_home.zip: 完了

    (中略)

      Oracle Database Docker Image for Real Application Clusters (RAC) version 19.3.0 is ready to be extended:

        --> oracle/database-rac:19.3.0

      Build completed in 988 seconds.


途中、こんなエラーがでる場合があります(私は100%遭遇します...)が、無視して大丈夫です。
(参考：https://github.com/oracle/docker-images/issues/1416)

    /opt/scripts/install/installGridBinaries.sh: line 57:  : command not found

### 6-2. Docker ネットワーク設定
Docker コンテナ間のネットワークを設定します。
rac_pub1_nw がパブリックLAN、rac_priv1_nw がプライベートLANになります。

    [opc@rac-instance01 dockerfiles]$ sudo docker network create --driver=bridge --subnet=172.16.1.0/24 rac_pub1_nw
    b6d7984df77c6e42705bd242ee2e790882b2d9f5ff2ef20cf369b7105238adf4
    [opc@rac-instance01 dockerfiles]$ sudo docker network create --driver=bridge --subnet=192.168.17.0/24 rac_priv1_nw
    a47b39a3b43bebcc1d8a7676ac6786a581919f0dd20cab79c0ffbcb7005153ea

### 6-3. 共有ホストファイルの作成
全てのコンテナは、ホスト名の名前解決のために共有ホストファイルを使用します。共有ホストファイルはすべてのコンテナで利用可能である必要があるため、Docker ホスト上にファイルを作成します。
なお、現時点では空のファイルで大丈夫です。ノード作成時に自動的に hosts の中身が書き込まれます。

    [opc@rac-instance01 dockerfiles]$ sudo mkdir /opt/containers
    [opc@rac-instance01 dockerfiles]$ sudo touch /opt/containers/rac_host_file
    [opc@rac-instance01 dockerfiles]$ ls -l /opt/containers/rac_host_file
    -rw-r--r--. 1 root root 0  1月  6 22:12 /opt/containers/rac_host_file

### 6-4. パスワードファイルの作成
ノードの作成またはノードの追加中に、grid / oracle および データベースパスワードが必要になるため、事前にパスワードを暗号化したファイルを作成します。それぞれ個別にパスワードを設定可能ですが、今回は全て共通のパスワードで設定します。

    [opc@rac-instance01 dockerfiles]$ sudo su -
    [root@rac-instance01 ~]# mkdir /opt/.secrets/
    [root@rac-instance01 ~]# openssl rand -hex 64 -out /opt/.secrets/pwd.key

echo で パスワードとする文字列をファイルにリダイレクトします。
今回は "oracle" としています。

    [root@rac-instance01 ~]# echo oracle > /opt/.secrets/common_os_pwdfile
    [root@rac-instance01 ~]# 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

暗号化したファイルが作成できたら、平文のファイルは削除します。

    [root@rac-instance01 ~]# rm -f /opt/.secrets/common_os_pwdfile

### 6-5. ASM 領域とする共有 DISK の作成
ASM 領域とするための共有DISK領域をブロックデバイスで作成します。
(RAC Storage Container という NAS 用のコンテナを立ててそこを共有 DISK とする方式もあるのですが、今回はブロックデバイス方式でいきます)

OCI Compute 作成時に拡張したブートボリュームは既に既存のファイルシステムに割り当てているので、別途ブート・ボリュームを拡張した上で新規パーティションを作成し、ASM 領域として使用します。なお、この作業は必ず 4.3 でブート・ボリュームを拡張した後で行ってください。これは、oci-growfs での拡張が、最終パーティション番号のパーティションにだけ有効であるためです。
(デフォルトでは / がマウントしている /dev/sda3 のパーティションが最後なので、oci-growfsで / が容易に拡張できる)

では、まず OCI Console でブロック・デバイスをオンライン拡張します。
OCI Console の左上のハンバーガーメニューをクリックし、[コンピュート]-[ブート・ボリューム]を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/07c769db-5672-3ca6-2657-f60da26e88b0.png)

対象のブート・ボリュームを選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/8f261ecd-8df0-3cbe-8712-e7eeced5c935.png)

[編集] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/31e402ee-5501-9d33-4a0f-54da5bee5b72.png)

[ボリューム・サイズ(GB)] の入力欄に、希望のASMサイズ分プラスした値を入力します。今回は100GB分をASMとするため、元々の 200GB から 100GB 足して、300GB とします。
入力したら、[変更の保存] をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/8c7fcb48-322b-611f-16ea-2e326a42fead.png)

するとこんなのが出るので、[再スキャン・コマンド] を控えておきます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/eb6416ee-b265-feac-f3bb-1eb9936d639a.png)

アイコンがオレンジから、グリーンの[使用可能]に戻ったら、OCI Console での作業は完了です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/991017/0a191809-3fdd-a0f2-26cb-cb3331e34496.png)

現在のブロック・デバイスの状態を確認します。
特に変わっていません。

    [opc@rac-instance01 dockerfiles]$ lsblk
    NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
    sda      8:0    0   200G  0 disk              ★200GBのまま
    tqsda2   8:2    0     8G  0 part [SWAP]
    tqsda3   8:3    0 191.8G  0 part /
    mqsda1   8:1    0   200M  0 part /boot/efi

先程 OCI Console で控えた再スキャン・コマンドを実行し、ブロックデバイスの拡張を OS に認識させます。

    [opc@rac-instance01 dockerfiles]$ sudo dd iflag=direct if=/dev/oracleoci/oraclevda of=/dev/null count=1
    echo "1" | sudo tee /sys/class/block/`readlink /dev/oracleoci/oraclevda | cut -d'/' -f 2`/device/rescan1+0 レコード入力
    1+0 レコード出力
    512 バイト (512 B) コピーされました、 0.000896604 秒、 571 kB/秒
    [opc@rac-instance01 dockerfiles]$ echo "1" | sudo tee /sys/class/block/`readlink /dev/oracleoci/oraclevda | cut -d'/' -f 2`/device/rescan
    1

改めて、ブロック・デバイスの状態を確認します。
300GBに拡張されていることが確認できます。

    [opc@rac-instance01 dockerfiles]$ lsblk
    NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
    sda      8:0    0   300G  0 disk              ★300GBになっている
    tqsda2   8:2    0     8G  0 part [SWAP]
    tqsda3   8:3    0 191.8G  0 part /
    mqsda1   8:1    0   200M  0 part /boot/efi

拡張したブロックデバイスに、パーティションを追加します。
parted 実行直後にエラーや警告が出ますが、Fixしておきます。

    [opc@rac-instance01 ~]$ sudo -s
    [root@rac-instance01 opc]# parted /dev/sda
    (parted) print
    エラー: あるべき GPT テーブルのバックアップがディスクの最後にありません。他の OS がディスクはもっと小さいものだと思っているのかもしれません。バックアップを最後に持ってきて（古いバックアップを削除して）修復しますか？
    修正/Fix/無視(I)/Ignore/取消(C)/Cancel? Fix
    警告: /dev/sda で利用可能な領域の一部が利用されていません。GPT を修正して全ての領域を利用可能にするか(209715200 ブロック増えます)、このままで続行することができますが、どうしますか？
    修正/Fix/無視(I)/Ignore? Fix

    番号  開始    終了    サイズ  ファイルシステム  名前                  フラグ
     1    1049kB  211MB   210MB   fat16             EFI System Partition  boot
     2    211MB   8801MB  8590MB  linux-swap(v1)
     3    8801MB  215GB   206GB   xfs

最後のパーティション番号の終了のサイズから 100% を割り当てます。
今回は、番号3の終了の 215GB を始点とします。

    (parted) mkpart gpt 215GB 100%

確認すると、パーティション番号4 ができています。

    (parted) print

    番号  開始    終了    サイズ  ファイルシステム  名前                  フラグ
     1    1049kB  211MB   210MB   fat16             EFI System Partition  boot
     2    211MB   8801MB  8590MB  linux-swap(v1)
     3    8801MB  215GB   206GB   xfs
     4    215GB   322GB   107GB                     gpt

    (parted) q

作成したパーティションは /dev/sda4 です。

    [root@rac-instance01 opc]# lsblk
    NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
    sda      8:0    0   300G  0 disk
     -sda4   8:4    0   100G  0 part           ★作成したパーティション
     -sda2   8:2    0     8G  0 part [SWAP]
     -sda3   8:3    0 191.8G  0 part /
     -sda1   8:1    0   200M  0 part /boot/efi

追加したパーティションを初期化します。

    [root@rac-instance01 opc]# dd if=/dev/zero of=/dev/sda4  bs=8k count=100000
    100000+0 レコード入力
    100000+0 レコード出力
    819200000 バイト (819 MB) コピーされました、 4.09183 秒、 200 MB/秒


# 7. Oracle Database RAC Node1 の作成

### 7-1. Docker コンテナの作成
RACノード1つ目のコンテナを作成します。オプションで色々変更可能です。[Github の手順の最後らへん](https://github.com/oracle/docker-images/tree/master/OracleDatabase/RAC/OracleRealApplicationClusters#section-7-environment-variables-for-the-second-and-subsequent-nodes)に各種オプションの説明があります。

    [opc@rac-instance01 ~]$ sudo 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 \
        --device=/dev/sda4:/dev/asm_disk1  \
        --privileged=false  \
        --cap-add=SYS_NICE \
        --cap-add=SYS_RESOURCE \
        --cap-add=NET_ADMIN \
        -e NODE_VIP=172.16.1.160 \
        -e VIP_HOSTNAME=racnode1-vip  \
        -e PRIV_IP=192.168.17.150 \
        -e PRIV_HOSTNAME=racnode1-priv \
        -e PUBLIC_IP=172.16.1.150 \
        -e PUBLIC_HOSTNAME=racnode1  \
        -e SCAN_NAME=racnode-scan \
        -e SCAN_IP=172.16.1.70  \
        -e OP_TYPE=INSTALL \
        -e DOMAIN=example.com \
        -e ASM_DEVICE_LIST=/dev/asm_disk1 \
        -e ORACLE_SID=ORCL \
        -e ASM_DISCOVERY_DIR=/dev \
        -e CMAN_HOSTNAME=racnode-cman1 \
        -e CMAN_IP=172.16.1.15 \
        -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:19.3.0

### 7-2. コンテナにネットワークを割り当てる
作成したコンテナにネットワークを割り当てます。

    [opc@rac-instance01 ~]$ sudo docker network disconnect bridge racnode1
    [opc@rac-instance01 ~]$ sudo docker network connect rac_pub1_nw --ip 172.16.1.150 racnode1
    [opc@rac-instance01 ~]$ sudo docker network connect rac_priv1_nw --ip 192.168.17.150  racnode1

### 7-3. RAC コンテナの起動  (RAC Node 1)
ここからが本番です。RAC 1ノード目のコンテナを起動します。
このコンテナ起動により、GI/DBのインストールやDB作成、RACの構成が行われます。

    [opc@rac-instance01 ~]$ sudo docker start racnode1
    racnode1

起動コマンド自体はすぐリターンが返ります。
以下のコマンドでログを確認し、エラーが起きないことを確認します。
完了まで早くても40分～1時間程度はかかります。

    [opc@rac-instance01 ~]$ sudo docker logs -f racnode1

成功すれば、最後に以下のメッセージが表示されます。

    ####################################
    ORACLE RAC DATABASE IS READY TO USE!
    ####################################

もし途中で何らかのエラーが発生して処理が止まってしまった場合は、以下のコマンドでコンテナにログインし、/tmp/orod.log や $GRID_BASE/diag/crs 等に出力されているログを確認してください。

    [opc@rac-instance01 ~]$ sudo docker exec -i -t racnode1 /bin/bash

起動が成功したのでコンテナにログインして確認してみます。

    [opc@rac-instance01 ~]$ sudo docker exec -i -t racnode1 /bin/bash
    [grid@racnode1 ~]$ sudo su - oracle
    [oracle@racnode1 ~]$ /u01/app/19.3.0/grid/bin/crsctl stat res -t
    --------------------------------------------------------------------------------
    Name           Target  State        Server                   State details
    --------------------------------------------------------------------------------
    Local Resources
    --------------------------------------------------------------------------------
    ora.LISTENER.lsnr
                   ONLINE  ONLINE       racnode1                 STABLE
    ora.chad
                   ONLINE  ONLINE       racnode1                 STABLE
    ora.net1.network
                   ONLINE  ONLINE       racnode1                 STABLE
    ora.ons
                   ONLINE  ONLINE       racnode1                 STABLE
    --------------------------------------------------------------------------------
    Cluster Resources
    --------------------------------------------------------------------------------
    ora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup)
          1        ONLINE  ONLINE       racnode1                 STABLE
          2        OFFLINE OFFLINE                               STABLE
          3        OFFLINE OFFLINE                               STABLE
    ora.DATA.dg(ora.asmgroup)
          1        ONLINE  ONLINE       racnode1                 STABLE
          2        OFFLINE OFFLINE                               STABLE
          3        OFFLINE OFFLINE                               STABLE
    ora.LISTENER_SCAN1.lsnr
          1        ONLINE  ONLINE       racnode1                 STABLE
    ora.asm(ora.asmgroup)
          1        ONLINE  ONLINE       racnode1                 Started,STABLE
          2        OFFLINE OFFLINE                               STABLE
          3        OFFLINE OFFLINE                               STABLE
    ora.asmnet1.asmnetwork(ora.asmgroup)
          1        ONLINE  ONLINE       racnode1                 STABLE
          2        OFFLINE OFFLINE                               STABLE
          3        OFFLINE OFFLINE                               STABLE
    ora.cvu
          1        ONLINE  ONLINE       racnode1                 STABLE
    ora.orcl.db
          1        ONLINE  ONLINE       racnode1                 Open,HOME=/u01/app/o
                                                                 racle/product/19.3.0
                                                                 /dbhome_1,STABLE
    ora.qosmserver
          1        ONLINE  ONLINE       racnode1                 STABLE
    ora.racnode1.vip
          1        ONLINE  ONLINE       racnode1                 STABLE
    ora.scan1.vip
          1        ONLINE  ONLINE       racnode1                 STABLE
    --------------------------------------------------------------------------------
    [oracle@racnode1 ~]$ exit
    logout
    [grid@racnode1 ~]$ exit
    exit
    [opc@rac-instance01 ~]$

問題無さそうなので、引き続き2ノード目以降を作成していきます。

# 8. Oracle Database RAC Node2 の追加

### 8-1. Docker コンテナの作成
先程作成した RAC環境に、2ノード目を追加します。
基本的に手順は同じですが、オプションで指定する内容が少しだけ違います。(ホスト名、ノード名、IPアドレス、CLS既存ノードの指定、ノード追加オプションなど)

    [opc@rac-instance01 ~]$ sudo docker create -t -i \
        --hostname racnode2 \
        --volume /dev/shm \
        --tmpfs /dev/shm:rw,exec,size=4G  \
        --volume /boot:/boot:ro \
        --dns-search=example.com  \
        --volume /opt/containers/rac_host_file:/etc/hosts \
        --volume /opt/.secrets:/run/secrets \
        --device=/dev/sda4:/dev/asm_disk1  \
        --privileged=false \
        --cap-add=SYS_NICE \
        --cap-add=SYS_RESOURCE \
        --cap-add=NET_ADMIN \
        -e EXISTING_CLS_NODES=racnode1 \   ★既存ノードを指定する
        -e NODE_VIP=172.16.1.161  \
        -e VIP_HOSTNAME=racnode2-vip  \
        -e PRIV_IP=192.168.17.151  \
        -e PRIV_HOSTNAME=racnode2-priv \
        -e PUBLIC_IP=172.16.1.151  \
        -e PUBLIC_HOSTNAME=racnode2  \
        -e DOMAIN=example.com \
        -e SCAN_NAME=racnode-scan \
        -e SCAN_IP=172.16.1.70 \
        -e ASM_DISCOVERY_DIR=/dev \
        -e ASM_DEVICE_LIST=/dev/asm_disk1\
        -e ORACLE_SID=ORCL \
        -e OP_TYPE=ADDNODE \              ★ノード追加オプション
        -e COMMON_OS_PWD_FILE=common_os_pwdfile.enc \
        -e PWD_KEY=pwd.key \
        --tmpfs=/run -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
        --cpu-rt-runtime=95000 --ulimit rtprio=99  \
        --restart=always \
        --name racnode2 \
        oracle/database-rac:19.3.0

### 8-2. コンテナにネットワークを割り当てる
作成したコンテナにネットワークを割り当てます。

    [opc@rac-instance01 ~]$ sudo docker network disconnect bridge racnode2
    [opc@rac-instance01 ~]$ sudo docker network connect rac_pub1_nw --ip 172.16.1.151 racnode2
    [opc@rac-instance01 ~]$ sudo docker network connect rac_priv1_nw --ip 192.168.17.151  racnode2

### 8-3. RAC コンテナの起動  (RAC Node 2)
RAC 2ノード目のコンテナを起動します。やることは 1ノード目と同じです。

    [opc@rac-instance01 ~]$ sudo docker start racnode2
    racnode2

以下のコマンドでログを確認し、エラーが起きないことを確認します。

    [opc@rac-instance01 ~]$ sudo docker logs -f racnode2

成功すれば、最後に以下のメッセージが表示されます。
2ノード目以降は、1ノード目のときよりは時間はかかりません。今回の環境では10分程度で終わりました。

    ####################################
    ORACLE RAC DATABASE IS READY TO USE!
    ####################################

起動が成功したので、ログインして確認します。

    [opc@rac-instance01 ~]$ sudo docker exec -i -t racnode2 /bin/bash
    [grid@racnode2 ~]$ sudo su - oracle
    [oracle@racnode2 ~]$ /u01/app/19.3.0/grid/bin/crsctl stat res -t
    --------------------------------------------------------------------------------
    Name           Target  State        Server                   State details
    --------------------------------------------------------------------------------
    Local Resources
    --------------------------------------------------------------------------------
    ora.LISTENER.lsnr
                   ONLINE  ONLINE       racnode1                 STABLE
                   ONLINE  ONLINE       racnode2                 STABLE
    ora.chad
                   ONLINE  ONLINE       racnode1                 STABLE
                   ONLINE  ONLINE       racnode2                 STABLE
    ora.net1.network
                   ONLINE  ONLINE       racnode1                 STABLE
                   ONLINE  ONLINE       racnode2                 STABLE
    ora.ons
                   ONLINE  ONLINE       racnode1                 STABLE
                   ONLINE  ONLINE       racnode2                 STABLE
    --------------------------------------------------------------------------------
    Cluster Resources
    --------------------------------------------------------------------------------
    ora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup)
          1        ONLINE  ONLINE       racnode1                 STABLE
          2        ONLINE  ONLINE       racnode2                 STABLE
          3        OFFLINE OFFLINE                               STABLE
    ora.DATA.dg(ora.asmgroup)
          1        ONLINE  ONLINE       racnode1                 STABLE
          2        ONLINE  ONLINE       racnode2                 STABLE
          3        OFFLINE OFFLINE                               STABLE
    ora.LISTENER_SCAN1.lsnr
          1        ONLINE  ONLINE       racnode1                 STABLE
    ora.asm(ora.asmgroup)
          1        ONLINE  ONLINE       racnode1                 Started,STABLE
          2        ONLINE  ONLINE       racnode2                 Started,STABLE
          3        OFFLINE OFFLINE                               STABLE
    ora.asmnet1.asmnetwork(ora.asmgroup)
          1        ONLINE  ONLINE       racnode1                 STABLE
          2        ONLINE  ONLINE       racnode2                 STABLE
          3        OFFLINE OFFLINE                               STABLE
    ora.cvu
          1        ONLINE  ONLINE       racnode1                 STABLE
    ora.orcl.db
          1        ONLINE  ONLINE       racnode1                 Open,HOME=/u01/app/o
                                                                 racle/product/19.3.0
                                                                 /dbhome_1,STABLE
          2        ONLINE  ONLINE       racnode2                 Open,HOME=/u01/app/o
                                                                 racle/product/19.3.0
                                                                 /dbhome_1,STABLE
    ora.qosmserver
          1        ONLINE  ONLINE       racnode1                 STABLE
    ora.racnode1.vip
          1        ONLINE  ONLINE       racnode1                 STABLE
    ora.racnode2.vip
          1        ONLINE  ONLINE       racnode2                 STABLE
    ora.scan1.vip
          1        ONLINE  ONLINE       racnode1                 STABLE
    --------------------------------------------------------------------------------

問題無く2ノード目が追加されていました。
引き続き3ノード目を追加します。

# 9. Oracle Database RAC Node3 の追加

### 9-1. Docker コンテナの作成
RAC環境に、3ノード目を追加します。2ノード目と手順、変更点は全く同じです。

    [opc@rac-instance01 ~]$ sudo docker create -t -i \
      --hostname racnode3 \
      --volume /dev/shm \
      --tmpfs /dev/shm:rw,exec,size=4G  \
      --volume /boot:/boot:ro \
      --dns-search=example.com  \
      --volume /opt/containers/rac_host_file:/etc/hosts \
      --volume /opt/.secrets:/run/secrets \
      --device=/dev/sda4:/dev/asm_disk1  \
      --privileged=false \
      --cap-add=SYS_NICE \
      --cap-add=SYS_RESOURCE \
      --cap-add=NET_ADMIN \
      -e EXISTING_CLS_NODES=racnode1,racnode2 \  ★既存ノードを指定する
      -e NODE_VIP=172.16.1.162  \
      -e VIP_HOSTNAME=racnode3-vip  \
      -e PRIV_IP=192.168.17.152  \
      -e PRIV_HOSTNAME=racnode3-priv \
      -e PUBLIC_IP=172.16.1.152  \
      -e PUBLIC_HOSTNAME=racnode3  \
      -e DOMAIN=example.com \
      -e SCAN_NAME=racnode-scan \
      -e SCAN_IP=172.16.1.70 \
      -e ASM_DISCOVERY_DIR=/dev \
      -e ASM_DEVICE_LIST=/dev/asm_disk1\
      -e ORACLE_SID=ORCL \
      -e OP_TYPE=ADDNODE \                      ★ノード追加オプション
      -e COMMON_OS_PWD_FILE=common_os_pwdfile.enc \
      -e PWD_KEY=pwd.key \
      --tmpfs=/run -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
      --cpu-rt-runtime=95000 --ulimit rtprio=99  \
      --restart=always \
      --name racnode3 \
      oracle/database-rac:19.3.0

### 9-2. コンテナにネットワークを割り当てる
作成したコンテナにネットワークを割り当てます。

    [opc@rac-instance01 ~]$ sudo docker network disconnect bridge racnode3
    [opc@rac-instance01 ~]$ sudo docker network connect rac_pub1_nw --ip 172.16.1.152 racnode3
    [opc@rac-instance01 ~]$ sudo docker network connect rac_priv1_nw --ip 192.168.17.152  racnode3

### 9-3. RAC コンテナの起動  (RAC Node 3)
RAC 3ノード目のコンテナを起動します。
やることは 2ノード目と同じです。

    [opc@rac-instance01 ~]$ sudo docker start racnode3
    racnode3

以下のコマンドでログを確認し、エラーが起きないことを確認します。

    [opc@rac-instance01 ~]$ sudo docker logs -f racnode3

成功すれば、最後に以下のメッセージが表示されます。
2ノード目以降は、1ノード目のときよりは時間はかかりません。今回の環境では10分程度で終わりました。

    ####################################
    ORACLE RAC DATABASE IS READY TO USE!
    ####################################

起動が成功したので、ログインして確認します。

    [opc@rac-instance01 ~]$ sudo docker exec -i -t racnode3 /bin/bash
    [grid@racnode3 ~]$ sudo su - oracle
    [oracle@racnode3 ~]$ /u01/app/19.3.0/grid/bin/crsctl stat res -t
    --------------------------------------------------------------------------------
    Name           Target  State        Server                   State details
    --------------------------------------------------------------------------------
    Local Resources
    --------------------------------------------------------------------------------
    ora.LISTENER.lsnr
                   ONLINE  ONLINE       racnode1                 STABLE
                   ONLINE  ONLINE       racnode2                 STABLE
                   ONLINE  ONLINE       racnode3                 STABLE
    ora.chad
                   ONLINE  ONLINE       racnode1                 STABLE
                   ONLINE  ONLINE       racnode2                 STABLE
                   ONLINE  ONLINE       racnode3                 STABLE
    ora.net1.network
                   ONLINE  ONLINE       racnode1                 STABLE
                   ONLINE  ONLINE       racnode2                 STABLE
                   ONLINE  ONLINE       racnode3                 STABLE
    ora.ons
                   ONLINE  ONLINE       racnode1                 STABLE
                   ONLINE  ONLINE       racnode2                 STABLE
                   ONLINE  ONLINE       racnode3                 STABLE
    --------------------------------------------------------------------------------
    Cluster Resources
    --------------------------------------------------------------------------------
    ora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup)
          1        ONLINE  ONLINE       racnode1                 STABLE
          2        ONLINE  ONLINE       racnode2                 STABLE
          3        ONLINE  ONLINE       racnode3                 STABLE
    ora.DATA.dg(ora.asmgroup)
          1        ONLINE  ONLINE       racnode1                 STABLE
          2        ONLINE  ONLINE       racnode2                 STABLE
          3        ONLINE  ONLINE       racnode3                 STABLE
    ora.LISTENER_SCAN1.lsnr
          1        ONLINE  ONLINE       racnode1                 STABLE
    ora.asm(ora.asmgroup)
          1        ONLINE  ONLINE       racnode1                 Started,STABLE
          2        ONLINE  ONLINE       racnode2                 Started,STABLE
          3        ONLINE  ONLINE       racnode3                 Started,STABLE
    ora.asmnet1.asmnetwork(ora.asmgroup)
          1        ONLINE  ONLINE       racnode1                 STABLE
          2        ONLINE  ONLINE       racnode2                 STABLE
          3        ONLINE  ONLINE       racnode3                 STABLE
    ora.cvu
          1        ONLINE  ONLINE       racnode1                 STABLE
    ora.orcl.db
          1        ONLINE  ONLINE       racnode1                 Open,HOME=/u01/app/o
                                                                 racle/product/19.3.0
                                                                 /dbhome_1,STABLE
          2        ONLINE  ONLINE       racnode2                 Open,HOME=/u01/app/o
                                                                 racle/product/19.3.0
                                                                 /dbhome_1,STABLE
          3        ONLINE  ONLINE       racnode3                 Open,HOME=/u01/app/o
                                                                 racle/product/19.3.0
                                                                 /dbhome_1,STABLE
    ora.qosmserver
          1        ONLINE  ONLINE       racnode1                 STABLE
    ora.racnode1.vip
          1        ONLINE  ONLINE       racnode1                 STABLE
    ora.racnode2.vip
          1        ONLINE  ONLINE       racnode2                 STABLE
    ora.racnode3.vip
          1        ONLINE  ONLINE       racnode3                 STABLE
    ora.scan1.vip
          1        ONLINE  ONLINE       racnode1                 STABLE
    --------------------------------------------------------------------------------
問題無く3ノード目が追加されました。
引き続き、最後の4ノード目を追加します。

# 10. Oracle Database RAC Node4 の追加

### 10-1. Docker コンテナの作成
RAC環境に、4ノード目を追加します。2,3ノード目と手順、変更点は全く同じです。


    [opc@rac-instance01 ~]$ sudo docker create -t -i \
        --hostname racnode4 \
        --volume /dev/shm \
        --tmpfs /dev/shm:rw,exec,size=4G  \
        --volume /boot:/boot:ro \
        --dns-search=example.com  \
        --volume /opt/containers/rac_host_file:/etc/hosts \
        --volume /opt/.secrets:/run/secrets \
        --device=/dev/sda4:/dev/asm_disk1  \
        --privileged=false \
        --cap-add=SYS_NICE \
        --cap-add=SYS_RESOURCE \
        --cap-add=NET_ADMIN \
        -e EXISTING_CLS_NODES=racnode1,racnode2,racnode3 \
        -e NODE_VIP=172.16.1.163  \
        -e VIP_HOSTNAME=racnode4-vip  \
        -e PRIV_IP=192.168.17.153  \
        -e PRIV_HOSTNAME=racnode4-priv \
        -e PUBLIC_IP=172.16.1.153  \
        -e PUBLIC_HOSTNAME=racnode4  \
        -e DOMAIN=example.com \
        -e SCAN_NAME=racnode-scan \
        -e SCAN_IP=172.16.1.70 \
        -e ASM_DISCOVERY_DIR=/dev \
        -e ASM_DEVICE_LIST=/dev/asm_disk1\
        -e ORACLE_SID=ORCL \
        -e OP_TYPE=ADDNODE \
        -e COMMON_OS_PWD_FILE=common_os_pwdfile.enc \
        -e PWD_KEY=pwd.key \
        --tmpfs=/run -v /sys/fs/cgroup:/sys/fs/cgroup:ro \
        --cpu-rt-runtime=95000 --ulimit rtprio=99  \
        --restart=always \
        --name racnode4 \
        oracle/database-rac:19.3.0

### 10-2. コンテナにネットワークを割り当てる
作成したコンテナにネットワークを割り当てます。

    [opc@rac-instance01 ~]$ sudo docker network disconnect bridge racnode4
    [opc@rac-instance01 ~]$ sudo docker network connect rac_pub1_nw --ip 172.16.1.153 racnode4
    [opc@rac-instance01 ~]$ sudo docker network connect rac_priv1_nw --ip 192.168.17.153  racnode4

### 10-3. RAC コンテナの起動  (RAC Node 4)
RAC 4ノード目のコンテナを起動します。
やることは 2,3ノード目と同じです。

    [opc@rac-instance01 ~]$ sudo docker start racnode4
    racnode4

以下のコマンドでログを確認し、エラーが起きないことを確認します。

    [opc@rac-instance01 ~]$ sudo docker logs -f racnode4

成功すれば、最後に以下のメッセージが表示されます。

    ####################################
    ORACLE RAC DATABASE IS READY TO USE!
    ####################################

起動が成功したので、ログインして確認します。

    [opc@rac-instance01 ~]$ sudo docker exec -i -t racnode4 /bin/bash
    [grid@racnode4 ~]$ sudo su - oracle
    [oracle@racnode4 ~]$ /u01/app/19.3.0/grid/bin/crsctl stat res -t

    --------------------------------------------------------------------------------
    Name           Target  State        Server                   State details
    --------------------------------------------------------------------------------
    Local Resources
    --------------------------------------------------------------------------------
    ora.LISTENER.lsnr
                   ONLINE  ONLINE       racnode1                 STABLE
                   ONLINE  ONLINE       racnode2                 STABLE
                   ONLINE  ONLINE       racnode3                 STABLE
                   ONLINE  ONLINE       racnode4                 STABLE
    ora.chad
                   ONLINE  ONLINE       racnode1                 STABLE
                   ONLINE  ONLINE       racnode2                 STABLE
                   ONLINE  ONLINE       racnode3                 STABLE
                   ONLINE  ONLINE       racnode4                 STABLE
    ora.net1.network
                   ONLINE  ONLINE       racnode1                 STABLE
                   ONLINE  ONLINE       racnode2                 STABLE
                   ONLINE  ONLINE       racnode3                 STABLE
                   ONLINE  ONLINE       racnode4                 STABLE
    ora.ons
                   ONLINE  ONLINE       racnode1                 STABLE
                   ONLINE  ONLINE       racnode2                 STABLE
                   ONLINE  ONLINE       racnode3                 STABLE
                   ONLINE  ONLINE       racnode4                 STABLE
    --------------------------------------------------------------------------------
    Cluster Resources
    --------------------------------------------------------------------------------
    ora.ASMNET1LSNR_ASM.lsnr(ora.asmgroup)
          1        ONLINE  ONLINE       racnode1                 STABLE
          2        ONLINE  ONLINE       racnode2                 STABLE
          3        ONLINE  ONLINE       racnode3                 STABLE
    ora.DATA.dg(ora.asmgroup)
          1        ONLINE  ONLINE       racnode1                 STABLE
          2        ONLINE  ONLINE       racnode2                 STABLE
          3        ONLINE  ONLINE       racnode3                 STABLE
    ora.LISTENER_SCAN1.lsnr
          1        ONLINE  ONLINE       racnode1                 STABLE
    ora.asm(ora.asmgroup)
          1        ONLINE  ONLINE       racnode1                 Started,STABLE
          2        ONLINE  ONLINE       racnode2                 Started,STABLE
          3        ONLINE  ONLINE       racnode3                 Started,STABLE
    ora.asmnet1.asmnetwork(ora.asmgroup)
          1        ONLINE  ONLINE       racnode1                 STABLE
          2        ONLINE  ONLINE       racnode2                 STABLE
          3        ONLINE  ONLINE       racnode3                 STABLE
    ora.cvu
          1        ONLINE  ONLINE       racnode1                 STABLE
    ora.orcl.db
          1        ONLINE  ONLINE       racnode1                 Open,HOME=/u01/app/o
                                                                 racle/product/19.3.0
                                                                 /dbhome_1,STABLE
          2        ONLINE  ONLINE       racnode2                 Open,HOME=/u01/app/o
                                                                 racle/product/19.3.0
                                                                 /dbhome_1,STABLE
          3        ONLINE  ONLINE       racnode3                 Open,HOME=/u01/app/o
                                                                 racle/product/19.3.0
                                                                 /dbhome_1,STABLE
          4        ONLINE  ONLINE       racnode4                 Open,HOME=/u01/app/o
                                                                 racle/product/19.3.0
                                                                 /dbhome_1,STABLE
    ora.qosmserver
          1        ONLINE  ONLINE       racnode1                 STABLE
    ora.racnode1.vip
          1        ONLINE  ONLINE       racnode1                 STABLE
    ora.racnode2.vip
          1        ONLINE  ONLINE       racnode2                 STABLE
    ora.racnode3.vip
          1        ONLINE  ONLINE       racnode3                 STABLE
    ora.racnode4.vip
          1        ONLINE  ONLINE       racnode4                 STABLE
    ora.scan1.vip
          1        ONLINE  ONLINE       racnode1                 STABLE
    --------------------------------------------------------------------------------

問題無く4ノード目が追加されました。

# 11. Database ログイン確認
DBにログインできるか確認してみます。

    [opc@rac-instance01 ~]$ sudo docker exec -i -t racnode1 /bin/bash
    [grid@racnode1 ~]$ export ORACLE_HOME=`echo ${DB_HOME}`
    [grid@racnode1 ~]$ export ORACLE_SID=ORCL1
    [grid@racnode1 ~]$ sqlplus / as sysdba

    SQL*Plus: Release 19.0.0.0.0 - Production on Wed Jan 6 16:12:43 2021
    Version 19.3.0.0.0

    Copyright (c) 1982, 2019, Oracle.  All rights reserved.


    Connected to:
    Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
    Version 19.3.0.0.0

    SQL> show pdbs

        CON_ID CON_NAME                       OPEN MODE  RESTRICTED
    ---------- ------------------------------ ---------- ----------
             2 PDB$SEED                       READ ONLY  NO
             3 ORCLPDB                        READ WRITE NO
 
    SQL> exit
    Disconnected from Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production
    Version 19.3.0.0.0

ログインできました。PDBも作成されています。

以上で完了です。

# 12. あとがき
これで OCI Compute 上に Docker で Oracle Database 19c の 4 Node RAC 環境が構築ができました。

この環境に Oracle Data Guard の Physical Standby コンテナを作成できたりもするのですが、それはまた別の機会に書きたいと思います。

なお、今回 OCI Compute 上で環境を構築しましたが、クラウド環境でなくて Virtual Box でも構築可能ですし実績もあります。新しめの Virtual Box であれば、Virtual Box で構築したイメージをそのまま OCI に移行するなんてこともできると思います。

~~最後に、冒頭でも記載しましたが、Docker に構築した Oracle Database 環境は検証・開発目的のみで利用可能です。決して本番環境では使用しないようにお願いいたします。~~ 冒頭でも記載しましたが、21c(21.3)以降では使用可能となりました。