1 DockerでOracle RACをインストールおよび構成する方法

これらの手順を使用してOracle Real Application Clusters (Oracle RAC)をOracle Container Runtime for Dockerにインストールします。

このドキュメントでは、DockerコンテナをホストするLinuxサーバーをDockerホストまたはホストと呼びます。Oracle RAC、Oracle Grid InfrastructureおよびOracle Automatic Storage Management (Oracle ASM)を実行しているDockerコンテナをまとめてDocker Oracle RACコンテナまたはOracle RACコンテナと呼びます。

DockerでのOracle RACの前提条件

DockerへのOracle Real Application Clusters (Oracle RAC)のデプロイを開始する前に、インストールの準備ができ、システムがソフトウェアおよび記憶域の要件を満たしていることを確認します。

Oracle RACをDockerにインストールするための準備

これらの手順を使用するには、テクノロジおよびオペレーティング・システムの背景知識が必要です。

次のテクノロジをよく理解している必要があります。

  • Linux
  • Docker
  • Oracle Real Application Clusters (Oracle RAC)インストール
  • Oracle Grid Infrastructureインストール
  • Oracle Automatic Storage Management (Oracle ASM)。

インストールは、基本的に標準のLinuxインストール手順に従います。ただし、Dockerがホスト・オペレーティング・システムと緊密に統合されているため、環境設定のステップの一部が若干異なります。ネームスペースおよびネームスペースを使用できないリソースを含め、Dockerアーキテクチャの説明は、Dockerドキュメントを参照してください。このガイドでは、相違点に焦点を当てます。標準のステップおよび構成の詳細は、Oracle Grid Infrastructureインストレーションおよびアップグレード・ガイドfor Linuxを参照してください。インストールを開始する前に、Oracle Grid Infrastructureのインストール・チェックリストを確認します。

DockerでのOracle RACのソフトウェアおよび記憶域の要件

DockerへのOracle RACのデプロイでサポートされるOracleソフトウェアのリリースと、使用可能な記憶域オプションを確認します。

ソフトウェア要件

Docker上のOracle Real Application Clusters (Oracle RAC)は現在、次のリリースでのみサポートされています。

  • Oracle Grid Infrastructureリリース19c (19.16以降のリリース更新)
  • Oracle Databaseリリース19c (19.16以降)
  • Oracle Container Runtime for Dockerリリース18.09以降
  • Oracle Linux 7-slim Dockerイメージ(oraclelinux:7-slim)
  • Oracle Linux 7.4 (Linux-x86-64)以降の更新上のOracle Linux for Dockerホスト。
  • Unbreakable Enterprise Kernelリリース5 (UEKR5)、Unbreakable Enterprise Kernel 6 (UEKR6)およびその更新。サポートされるカーネル・バージョンは、Oracle Linux Oracle Container Runtime for Dockerユーザー・ガイドを参照してください。

    この例では、Unbreakable Enterprise Kernel 5: 4.14.35-2047.501.2el7uek.x86_64を搭載したOracle Linux 7.9 (Linux-x86-64)を使用します。

関連項目:

Oracleオペレーティング・システムのドキュメント。「Oracle Linux」、「Oracle Linux 7」の順に選択し、"Docker"を検索してOracle Linux: Oracle Container Runtime for Dockerユーザー・ガイドを見つけます。

https://docs.oracle.com/en/operating-systems/

記憶域要件

Docker上のOracle RAC用のデータベース記憶域では、ブロック記憶域またはネットワーク・ファイル・システム(NFS)で構成されたOracle Automatic Storage Management (Oracle ASM)を使用する必要があります。

注意:

Oracle Automatic Storage Management Cluster File System (Oracle ACFS)およびOracle ASM Filter Driver (Oracle ASMFD)はサポートされていません。

DockerでのOracle RAC用のターゲット構成

このドキュメントの手順は、2つの異なるLinuxホスト・サーバーで実行されている2ノードのOracle RACクラスタでテストされ、共有記憶域にブロック・デバイスを使用しています。

Docker上のOracle RACの概要

Oracle Database 19c (19.16)以降、Oracle RACは本番デプロイメントのDockerコンテナでサポートされています。

本番環境で単一のホストが完全な停止時間を引き起こすのを防ぐには、異なる物理サーバーで実行されているDockerホスト間でOracle RACノードを分散します。テストおよび開発環境では、同じ物理サーバーで実行されているDockerホストでOracle RACを構成できます。このドキュメントの手順は、各ノードが別個のLinux Dockerホストで実行されている2ノードのOracle RACクラスタでテストされ、共有記憶域にブロック・デバイスを使用しています。

次の図に、一般的なテストおよび開発デプロイメントの例を示します。

次の図に、高可用性の記憶域およびネットワーク構成で、コンテナが別個のハードウェア・サーバー上の異なるDockerホストに配置されている本番デプロイメントを示します。

図1-1 Docker上の本番構成のOracle RAC

図1-1の説明が続く
「図1-1 Docker上の本番構成のOracle RAC」の説明

異なるハードウェア・サーバー上の異なるDockerホスト仮想マシンのコンテナにDockerクラスタ・ノードを配置すると、高可用性が向上します。次の図に、高可用性の記憶域およびネットワーク構成で、1つ目のホストには別々のゲスト・ドメインに2つのコンテナがあり、2つ目のホストにも2つのコンテナと2つの別々のゲスト・ドメインがある別の本番構成を示します。

図1-2 Docker上のOracle RAC用のベア・メタル・サーバーの本番デプロイメント

図1-2の説明が続きます。
「図1-2 Docker上のOracle RAC用のベア・メタル・サーバーの本番デプロイメント」の説明

次の図は、クラスタ・メンバー・ノードが同じDockerホストのコンテナであるDockerホストを示しています。右側の例は、同じハードウェア・サーバー上の2つのDockerホストを示しており、各ホストには別個のコンテナがあります。これは本番環境ではなく、開発に役立ちます。

図1-3 Docker上のOracle RACのテストまたは開発デプロイメントの例

図1-3の説明が続きます
「図1-3 Docker上のOracle RACのテストまたは開発デプロイメントの例」の説明

仮想テストおよび開発クラスタでは、テストに高可用性は不要であるため、2つ以上のDockerコンテナを同じクラスタのノードとして使用し、1つのOracle Linux Dockerホストでのみ実行できます。

Dockerホスト・サーバーの構成

Dockerホスト・サーバーの構成時に、次のガイドラインに従い、テストにOracleで使用される構成を確認してください。

Dockerサーバーは目的の数のDockerコンテナをサポートするのに十分である必要があり、各コンテナは少なくともOracle Real Application ClustersノードをホストするOracle Grid Infrastructureサーバーの最小要件を満たしている必要があります。クライアント・マシンは、Oracle RACノードから実行されるX Window System (X11)リモート・ディスプレイ対話型インストール・セッションに十分に対応できる必要があります。ただし、非対話型(サイレント)インストールを使用する場合、クライアント・マシンは必要ありません。

この例の構成のDockerコンテナは、Oracle Real Application Clusters (Oracle RAC)のマシンdocker-host-1およびdocker-host-2で作成されました。

  • Oracle RACノード1

    • Dockerホスト: docker-host-1
    • コンテナ: racnode1
    • CPUコアID: 0および1
    • RAM: 60 GB
    • スワップ・メモリー: 32 GB
    • Hugepages: 16384
    • オペレーティング・システム・ディスク:

      Oracle Grid Infrastructureでサポートされている任意の記憶域オプションを使用できます。記憶域には、少なくとも次の使用可能な容量があることを確認します。

      • ルート(/): 40 GB
      • /scratch: 80 GB (Oracle Grid InfrastructureおよびOracle Databaseのホームを格納するために/u01に使用されるDockerホスト・ディレクトリ)
      • /var/lib/docker: 100 GB xfs
    • Dockerバージョン: 19.03.1-01
    • Linux: Unbreakable Enterprise Kernel 5を搭載したOracle Linux 7.9 (Linux-x86-64): 4.14.35-2047.501.2el7uek.x86_64
  • Oracle RACノード2

    • Dockerホスト: docker-host-2
    • コンテナ: racnode2
    • CPUコアID: 0および1
    • RAM: 60 GB
    • スワップ・メモリー: 32 GB
    • Hugepages: 16384
    • オペレーティング・システム・ディスク:

      Oracle Grid Infrastructureでサポートされている任意の記憶域オプションを使用できます。記憶域には、少なくとも次の使用可能な容量があることを確認します。

      • ルート(/): 40 GB
      • /scratch: 80 GB (Oracle Grid InfrastructureおよびOracle Databaseのホームを格納するために/u01に使用されるDockerホスト・ディレクトリ)
      • /var/lib/docker: 100 GB xfs
    • Dockerバージョン: 19.03.1-01
    • Linux: Unbreakable Enterprise Kernel 5を搭載したOracle Linux 7.9 (Linux-x86-64): 4.14.35-2047.501.2el7uek.x86_64
  • ブロック・デバイス

    Oracle Grid Infrastructureでサポートされている任意の記憶域オプションを使用できます。記憶域には、少なくとも次の使用可能な容量があることを確認します。

    • /dev/sdd (50 GB)
    • /dev/sde (50 GB)

DockerコンテナおよびOracle RACノード

このドキュメントで使用される構成について学習し、遂行する手順を理解してください。

このドキュメントでは、このガイドで示す例として、2ノード構成を使用してDockerコンテナを作成するステップおよびコマンドを示します。後述の構成情報は、その構成のリファレンスです。

注意:

ユーザー独自の構成では、Dockerコンテナでのリアルタイム・プロセスの実行をサポートできる構成により、同じクラスタにおいても異なるクラスタにおいても、ノードとして使用する特定のDockerホスト内のDockerコンテナが10以下に制限されることに留意してください。ユーザー独自のデプロイメントで使用可能なノードの数を増やす場合は、複数のDockerホストを使用できます。各Dockerホストは、最大10個のDockerコンテナに制限されています。

この例の構成のDockerコンテナは、Oracle Real Application Clusters (Oracle RAC)のDockerホストdocker-host-1およびdocker-host-2で作成されました。

Oracle RACノード1

  • コンテナ: racnode1
  • CPUコアID: 0および1
  • メモリー
    • RAMメモリー: 16 GB
    • スワップ・メモリー: 16 GB
  • Oracle Automatic Storage Management (Oracle ASM)のディスク
    • /dev/asm-disk1
    • /dev/asm-disk2
  • ホスト名およびIPアドレス
    • racnode1、10.0.20.150
    • racnode1-vip、10.0.20.160
    • racnode1-priv、192.168.17.150
    • racnode-scan、10.0.20.170/171/172
    • ドメイン: example.info
  • racnode1のDockerボリュームは、Dockerホスト・ディレクトリ・パスと適切な権限を使用してマウントされます。

    マウントがディレクトリとして実行されるようにするために、-vまたは--volumeを使用して各マウントを指定します。ボリュームは、コロン文字(:)で区切られた3つのフィールドで構成されます。ボリュームを設定する際、ボリューム・フィールドは次の順序で設定する必要があります: source-path:target-path:options。たとえば:

    # docker container create ... --volume /boot:/boot:ro ... -name racnode1

    /bootは、コンテナ内でreadonlyである必要があります。

    次の各ボリュームがマウントされます。

    • /boot : 読取り専用(/boot:ro)
    • /dev/shm 読取り/書込み(/dev/shm)
    • /software/stage 読取り/書込み(/scratch/software/stage)
    • /u01 読取り/書込み(/scratch/rac/cluster01/node1)
    • /sys/fs/cgroup 読取り専用(/sys/fs/cgroup)
    • /etc/localtime 読取り専用(/etc/localtime)

    ノート:

    この手順の完了後、マウントが設定されていることを確認するために、Dockerコマンドdocker container inspect racnode1を実行できます。このコマンドを使用して構成のマウントを確認する方法の詳細は、Dockerドキュメントを参照してください。

  • Oracle Databaseの構成
    • インスタンス: orclcdb1
    • リリース19.16
    • CDB名: orclcdb
    • PDB名: orclpdb
    • インスタンス: orclcdb1
    • SGAサイズ: 3 GB
    • PGAサイズ: 2 GB

Oracle RACノード2

  • コンテナ: racnode2
  • CPUコアID: 2および3
  • メモリー
    • RAMメモリー: 16 GB
    • スワップ・メモリー: 16 GB
  • Oracle Automatic Storage Management (Oracle ASM)のディスク
    • /dev/asm/disk1
    • /dev/asm-disk2
  • ホスト名およびIPアドレス
    • racnode2、10.0.20.151
    • racnode2-vip、10.0.20.161
    • racnode2-priv、192.168.17.151
    • racnode-scan、10.0.20.170/171/172
    • ドメイン: example.info
  • racnode2のDockerボリュームは、Dockerホスト・ディレクトリ・パスと適切な権限を使用してマウントされます。

    マウントがディレクトリとして実行されるようにするために、-vまたは--volumeを使用してDockerのマウントを作成します。ボリュームは、コロン文字(:)で区切られた3つのフィールドで構成されます。ボリュームを構成する際、ボリューム・フィールドは次の順序で設定する必要があります: source-path:target-path:options。たとえば:

    # docker container create ... --volume /boot:/boot:ro ... -name racnode2

    次の各ボリュームが作成されます。

    • /boot : 読取り専用(/boot:ro)
    • /dev/shm 読取り/書込み(/dev/shm)
    • /software/stage 読取り/書込み(/scratch/software/stage)
    • /u01 読取り/書込み(/scratch/rac/cluster01/node2)
    • /sys/fs/cgroup 読取り専用(/sys/fs/cgroup)
    • /etc/localtime 読取り専用(/etc/localtime)

    ノート:

    この手順の完了後、マウントが設定されていることを確認するために、Dockerコマンドdocker container inspect racnode2を実行できます。このコマンドを使用して構成のマウントを確認する方法の詳細は、Dockerドキュメントを参照してください。

  • Oracle Databaseの構成
    • インスタンス: orclcdb2
    • リリース19.16
    • CDB名: orclcdb
    • PDB名: orclpdb
    • インスタンス: orclcdb1
    • SGAサイズ: 3 GB
    • PGAサイズ: 2 GB

関連トピック

Dockerホスト・サーバーのプロビジョニング

DockerをホストするLinuxサーバー(Dockerホスト・サーバー)は、ベア・メタル(物理)サーバーまたはOracle Linux仮想マシン(VM)にプロビジョニングできます。

Oracle Linux (Linux-x86-64)とOracle Grid InfrastructureおよびOracle Real Application Clusters (Oracle RAC)のインスタンスに必要な標準メモリー(RAM)に加えて、Dockerエンジン用に2 GBのRAMを追加で各Dockerホストに用意することをお薦めします。

Dockerホストの準備

Oracle Grid InfrastructureおよびOracle Real Application Clustersをインストールする前に、Oracle Container Runtime for Dockerをインストールする必要があります。

Dockerコンテナのインストールの準備

Oracle Dockerコンテナのドキュメントを確認し、デプロイ用にシステムを準備します。

クラスタの一部としてデプロイする各コンテナは、Oracle Real Application Clusters (Oracle RAC)およびOracle Grid Infrastructureソフトウェアの最小ハードウェア要件を満たしている必要があります。Oracle Grid InfrastructureおよびOracle RACデータベース・ソフトウェアを環境で使用可能になっているデータ・ボリュームにインストールする場合は、Dockerイメージ上のOracle RACに5 GB以上の容量を割り当てておく必要があります。ただし、イメージ内にソフトウェアをインストールする場合は、Dockerイメージ上のOracle RACに約20 GBを割り当てておく必要があります。

Dockerをさらによく理解するには、Oracle Container Runtime for Dockerの次の項を確認することをお薦めします。

  • Oracle Container Runtime for Dockerのインストール
  • Docker記憶域の構成
  • コンテナおよびイメージの操作
  • Dockerネットワークについて

関連項目:

Oracleオペレーティング・システムのドキュメント。「Oracle Linux」、「Oracle Linux 7」の順に選択し、"Docker"を検索してOracle Linux: Oracle Container Runtime for Dockerユーザー・ガイドを見つけます。

https://docs.oracle.com/en/operating-systems/

Dockerエンジンのインストール

この例では、DockerエンジンはUnbreakable Enterprise Kernel 5: 4.14.35-2047.501.2el7uek.x86_64を搭載したOracle Linux 7.9 (Linux-x86-64)にインストールされます。

そのインストールでは、Docker記憶域は/var/lib/dockerにあり、Docker OverlayFS記憶域ドライバ・オプションoverlay2xfsバッキング・ファイル・システムとともに使用し、d_type=trueが有効になっています。設定後、Dockerエンジンは次の例のようになります。
# docker info

Client:
 Debug Mode: false

Server:
 Containers: 0
 Running: 0
 Paused: 0
 Stopped: 0
 Images: 0
 Server Version: 19.03.1-ol
 Storage Driver: overlay2
 Backing Filesystem: xfs
 Supports d_type: true
 Native Overlay Diff: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Plugins:
 Volume: local
 Network: bridge host ipvlan macvlan null overlay
 Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: c4444445cb9z30000f49999ed999e6d4zz11c7c39
 runc version: 
 init version: fec3683
 Security Options:
 seccomp
 Profile: default
 Kernel Version: 4.14.35-2047.501.2el7uek.x86_64
 Operating System: Oracle Linux Server 7.9
 OSType: linux
 Architecture: x86_64
 CPUs: 8
 Total Memory: 58.71GiB
 Name: docker-inst-1-99242
 ID: ZZZ2:YYYG:VVVV:VVVV:RRRR:EZI2:XYRX:RJPS:7ZZZ:4KZ4:GFJ5:P26O
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
 127.0.0.0/8
 Live Restore Enabled: false

WARNING: bridge-nf-call-iptables is disabled
WARNING: bridge-nf-call-ip6tables is disabled
Registries:

関連項目:

Oracleオペレーティング・システムのドキュメント。「Oracle Linux」、「Oracle Linux 7」の順に選択し、"Docker"を検索してOracle Linux: Oracle Container Runtime for Dockerユーザー・ガイドを見つけます。

https://docs.oracle.com/en/operating-systems/

Oracle Grid Infrastructureデプロイメント用のLinuxリソースの割当て

Oracle Grid InfrastructureおよびOracle Real Application Clusters (Oracle RAC)コンテナ用のDockerホストでLinuxリソースの割当ておよび構成設定を構成します。

Dockerホストでのカーネル・パラメータの設定

カーネル・リソースの割当てが適切になるように、Linuxの/etc/sysctl.confファイルを更新します。

/etc/sysconfigディレクトリには、システムの構成を制御するファイルが含まれています。
  1. rootユーザーでログインします。
  2. vimエディタを使用して、/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
    • vm.nr_hugepages=16384
  3. 次のコマンドを実行します:
    # sysctl -a
    # sysctl –p
Oracleソフトウェア・バイナリのマウント・ポイントの作成

rootユーザーとして、ローカルまたはリモート記憶域にOracleソフトウェアのマウント・ポイントを作成します。

作成するマウント・ポイントは、すべてのDockerホストで使用可能で、iscsiなどのインタフェースを使用し、ファイル・パス/u01下の各コンテナ内でマウント可能である必要があります。

rootユーザーとして、次のようなコマンドを実行します。

docker-host-1の場合:

# mkdir -p /scratch/rac/cluster01/node1
docker-host-2の場合:
# mkdir -p /scratch/rac/cluster01/node2
共有メモリー・ファイル・システム・マウントの確認

このコマンドを使用して共有メモリーのマウントを確認します。

共有メモリー(/dev/shm)が十分なサイズでマウントされていることを確認します。これらの手順は4 GBでテストされました。

たとえば:

# df -h /dev/shm

df -hコマンドでは、/dev/shmがマウントされているファイル・システムと、共有メモリーの総容量および空き容量がGBで表示されます。

DockerホストでのNTPの構成

Oracle Real Application Clusters (Oracle RAC)コンテナ用のDockerホストでNTP (ネットワーク・タイム・プロトコル)サーバーを設定する必要があります。

Docker上のコンテナは、Dockerホストから時刻を継承します。このため、ネットワーク・タイム・プロトコル・デーモン(NTPD)は、Oracle RACコンテナ内ではなくDockerホストで実行する必要があります。ネットワーク・タイム・サーバーの設定方法の詳細は、Oracle Linux 7管理者ガイドのNTPDサービスの構成方法に関する項を参照してください。

DockerホストでのOracleソフトウェアをステージングするディレクトリの作成

Oracle Grid InfrastructureおよびOracle Real Application Clustersソフトウェアをステージングするには、ローカル記憶域またはリモート記憶域にマウント・ポイントを作成します。

Oracle RACクラスタのノード1からインストールを実行するとした場合、Oracleソフトウェア用に作成するマウント・ポイントは、少なくともノード1のDockerホストで使用可能で、コンテナ内のファイル・パス/stage/software下にマウント可能である必要があります。

rootユーザーとして、次のようなコマンドを実行します。

# mkdir -p /scratch/software/stage
# chmod a+rwx /scratch/software/stage
CVUの使用によるDockerホストの準備状況の検証

Dockerホストが正しく構成されていることを確認するために、Dockerホストでスタンドアロンのクラスタ検証ユーティリティ(CVU)を使用することをお薦めします。

CVUを使用すると、Oracle Real Application Clusters (Oracle RAC)用のDockerコンテナを作成するための準備、およびコンテナ内にOracle RACをインストールするための準備に関するシステム・チェックを実行できます。CVUによって、適切なシステム・チェックが自動的に実行され、検出された問題を解決するよう求められます。システム・チェックを役立たせるには、Oracle RACコンテナをホストするように構成するすべてのDockerホストで、このユーティリティを実行する必要があります。

CVUを入手するには、パッチ30839369: コンテナ・ホスト用スタンドアロンCVUバージョン21.7 2022年7月(パッチ)をダウンロードします。

ノート:

必ず、標準のCVUディストリビューションとは異なる、コンテナ・ホスト・パッチをダウンロードしてください。

Oracle RACプロセスに対するリアルタイム・モードの有効化

Oracle Real Application Clusters (Oracle RAC)用のDockerコンテナ内でプロセスを実行するには、DockerデーモンおよびコンテナでOpen Container Initiative (OCI)ランタイム機能を有効にする必要があります。

コンテナ内でプロセスをリアルタイム・モードで実行するには、/etc/sysconfig/dockerのOPTIONS値を更新する必要があります。
(オプション)ここでタスクの前提条件を入力します。
  1. rootとしてログインし、エディタで/usr/lib/systemd/system/docker.serviceを開きます。
  2. [Service]セクションのエントリExecStart=で始まる行について、次のパラメータ設定を追加します。
    --cpu-rt-runtime=950000

    パラメータを追加すると、ExecStart値は次の例のようになります。

    ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --cpu-rt-runtime=950000
  3. /usr/lib/systemd/system/docker.serviceファイルを保存します。
  4. 次のコマンドを実行して、デーモンおよびコンテナに変更をリロードします。
    # systemctl daemon-reload
    # systemctl stop docker
    # systemctl start docker

変更後、Dockerサービス・ステータス・コマンドを実行すると、次のような結果が戻される必要があります。

# 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 Mon 2020-04-13 23:45:39 GMT; 17h ago
 Docs: https://docs.docker.com
 Main PID: 12892 (dockerd)
 CGroup: /system.slice/docker.service
 12892 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --cpu-rt-runtime=950000

DockerでのOracle RAC用のDockerイメージのビルド

Oracle Real Application Clusters (Oracle RAC)インストール・イメージをビルドするには、イメージ・ディレクトリを作成してイメージを作成し、Dockerホストがインターネットに接続していることを確認します。

ノート:

この手順を1つのDockerホストで実行して他のDockerホストではイメージを使用することも、各Dockerホストで同じイメージ・ビルドの手順を繰り返すこともできます。

Dockerイメージ・ビルド・ディレクトリの作成

Dockerイメージの作成を実行するには、この手順を使用してビルド・プロセス用のディレクトリを作成します。

rootとしてログインし、次のコマンドを入力します。
# mkdir /scratch/image
# cd /scratch/image

コンテナ設定スクリプトの準備

デバイスの権限、デフォルトのルートおよびホスト環境の構成を維持するには、コンテナの再起動後に自動的に実行してコンテナ環境を構成するスクリプトを作成します。

Dockerコンテナを再起動すると、そのコンテナ用に以前構成されていたデバイスの権限、デフォルトのルートおよび/etc/hostsエントリがリセットされます。DockerおよびDockerコンテナの再起動の間で構成を維持するには、この手順を使用して、再起動後に環境を設定するために各コンテナで実行するように構成できるスクリプトを作成します。

Oracle Real Application Clusters (Oracle RAC)ではsystemdに基づいてコンテナを使用するため、Oracle RACスリム・イメージの作成時にコンテナ内の/etc/rc.localフォルダにスクリプトを追加することで、再起動のたびにコンテナ環境スクリプトを実行できます。再起動後、rc.localに追加したスクリプトで、Dockerコンテナ環境を確実に復元できます。これらの各ステップを順に実行します。Dockerイメージ・ビルド・ディレクトリ(この例では/stage/image)にファイルおよびスクリプトを作成します。

  1. コンテナ環境用のDockerホストでresolv.confを作成し、移入します。また、このresolv.confにはドメイン・ネーム・サーバー(DNS)検索のエントリおよび検索ドメインが含まれるため、コンテナを複数のホストにデプロイする場合、作成したこのファイルが、イメージがビルドされるすべてのDockerホストで使用可能になるようにする必要があります。

    このガイドの構成例では、DNSに関するホスト・ファイルの内容は次のとおりです。

    search example.info 
    nameserver 162.88.2.6
    
  2. Dockerコンテナのホスト名がDNSにない場合(ステップ1を参照)、イメージがビルドされるすべてのDockerホストでhostfileを作成して移入し、DockerコンテナのパブリックIPアドレス、プライベートIPアドレスおよび仮想IPアドレスのホスト・エントリをファイルに移入します。環境に対して設定したIPアドレスおよびホスト名を使用します。コンテナを複数のホストにデプロイする場合は、コンテナをデプロイする予定のすべてのDockerホストでhostfileが使用できるようにする必要があります。

    このガイドの構成例では、ホスト・ファイルの内容は次のとおりです。

    127.0.0.1 localhost
    ::1 localhost ip6-localhost ip6-loopback
    
    ## Public IP addresses
    10.0.20.150 racnode1.example.info racnode1
    10.0.20.151 racnode2.example.info racnode2
    
    ## Virtual IP addresses
    10.0.20.160 racnode1-vip.example.info racnode1-vip
    10.0.20.161 racnode2-vip.example.info racnode2-vip
    
    ## Private IPs
    192.168.17.150 racnode1-priv.example.info racnode1-priv
    192.168.17.151 racnode2-priv.example.info racnode2-priv
    
  3. Dockerイメージ・ビルド・ディレクトリにスクリプトsetupContainerEnv.shを作成し、次の内容をスクリプトにコピーして貼り付けます。

    たとえば:

    
    #!/bin/bash
    chown grid:asmadmin /dev/asm-disk1
    chown grid:asmadmin /dev/asm-disk2
    chmod 660 /dev/asm-disk1
    chmod 660 /dev/asm-disk2
    ip route del default
    # In the ip route command, replace with appropriate gateway IP
    ip route add default via 10.0.20.1
    cat /opt/scripts/startup/resolv.conf > /etc/resolv.conf
    cat /opt/scripts/startup/hostfile > /etc/hosts
    systemctl reset-failed
    

    常にスクリプト内のファイルの場所に対して完全なパスを使用し、スクリプトではPATH変数の設定を不要にします。

このスクリプトを追加して、コンテナ起動時にOracle RACコンテナの/etc/rc.localを使用して実行します。このステップは、DockerイメージでのOracle RACデータベースの構築に関する項を参照してください。setupContainerEnv.shスクリプトをコールするための行を/etc/rc.localに追加した後に、Dockerコンテナがリセットされた場合、Dockerコンテナが起動されてinitがロードされると、setupContainerEnv.shはコンテナの再起動のたびに次の操作を実行します。
  1. デフォルトのゲートウェイを設定します
  2. ASMデバイスに対する正しいデバイス権限を設定します
  3. /etc/hostsファイルを設定します。
  4. /etc/resolv.confファイルを設定します。

複数のホストにコンテナをデプロイする場合は、イメージがビルドされるすべてのDockerホストにsetupContainerEnv.shをコピーする必要があります。

ノート:

イメージ・ビルド時の設定スクリプトと、resolv.confおよびhostfileファイルの内容が、ビルド中にDockerイメージに埋め込まれます。その内容は、同じイメージを他のデプロイメントに使用してデプロイされたコンテナに適用されない場合があるので、ASMディスクおよびネットワーク構成が異なります。ただし、コンテナを作成して起動した後に、たとえば、コンテナにログインして/opt/scripts/startupのファイルおよびスクリプトを編集することで、その内容を変更できます。

DockerイメージでのOracle RAC用のDockerfileの作成

Oracle Real Application Clusters (Oracle RAC) Dockerfileイメージを設定するには、ベースOracle Linuxイメージをプルする必要があります。

  1. /scratch/image下にDockerfileというファイルを作成します。

  2. Dockerfileをエディタで開き、次の行をDockerfileに貼り付けます。

    
    # Pull base image
    # ---------------
    FROM oraclelinux:7-slim
    # Environment variables required for this build (do NOT change)
    # -------------------------------------------------------------
    ## Environment Variables
    ## ---
    ENV container=true \
        SCRIPT_DIR=/opt/scripts/startup \
        RESOLVCONFENV="resolv.conf" \
        HOSTFILEENV="hostfile" \
        SETUPCONTAINERENV="setupContainerEnv.sh"
          
    ### Copy Files
    # ----
    
    COPY $RESOLVCONFENV $HOSTFILEENV $SETUPCONTAINERENV $SCRIPT_DIR/
    
    ### RUN Commands
    # -----
    RUN yum -y install systemd oracle-database-preinstall-19c vim passwd openssh-server && \
     yum -y install policycoreutils && \
     yum -y install policycoreutils-python && \
     yum clean all && \
     sync && \
     groupadd -g 54334 asmadmin && \
     groupadd -g 54335 asmdba && \
     groupadd -g 54336 asmoper && \
     useradd -u 54332 -g oinstall -G oinstall,asmadmin,asmdba,asmoper,racdba,dba grid && \
     usermod -g oinstall -G oinstall,dba,oper,backupdba,dgdba,kmdba,asmdba,racdba,asmadmin oracle && \
     cp /etc/security/limits.d/oracle-database-preinstall-19c.conf /etc/security/limits.d/grid-database-preinstall-19c.conf && \
     sed -i 's/oracle/grid/g' /etc/security/limits.d/grid-database-preinstall-19c.conf && \
     rm -f /etc/rc.d/init.d/oracle-database-preinstall-19c-firstboot && \
     rm -f /etc/sysctl.conf && \
     echo "$SCRIPT_DIR/$SETUPCONTAINERENV" >> /etc/rc.local && \
     chmod +x $SCRIPT_DIR/$SETUPCONTAINERENV && \
     chmod +x /etc/rc.d/rc.local && \
     sync
    
    USER root
    WORKDIR /root
    VOLUME ["/software/stage"]
    VOLUME ["/u01"]
    CMD ["/usr/sbin/init"]
    # End of the Dockerfile
    

    アプリケーションに追加のパッケージが必要な場合は、それらをRUN yumコマンドに追加できます。

DockerイメージでのOracle RACの作成

Oracle Real Application Clusters (Oracle RAC)イメージを作成するには、必要に応じてOracle Linux環境を設定し、Dockerfileおよびコンテキストからイメージをビルドします。

  1. rootとしてログインし、以前に準備したイメージ作成用のディレクトリに移動します。

    # cd /scratch/image
  2. ユースケースの手順を実行します。

    • サーバーがプロキシ・ファイアウォールの内側にある場合:
      • 次のコマンドを実行します。説明:
        • localhost-domainは、ネットワーク内のインターネット・ゲートウェイのローカル・ホストおよびドメインです
        • http-proxyは、ネットワーク環境のHTTPプロキシ・サーバーです
        • https-proxyは、ネットワーク環境のHTTPSプロキシ・サーバーです
        • 19.16は、コンテナ内にインストールしようとしているOracle Databaseリリースです。
      # export NO_PROXY=localhost-domain 
      # export http_proxy=http-proxy
      # export https_proxy=https-proxy
      # export version=19.16.0
      # docker build --force-rm=true --no-cache=true --build-arg \
      http_proxy=${http_proxy} --build-arg https_proxy=${https_proxy} \
      -t oracle/database-rac:$version-slim  -f Dockerfile .
    • サーバーがプロキシ・ファイアウォールの内側にない場合:
      • 次のコマンドを実行します:
      # export version=19.16.0
      # docker build --force-rm=true --no-cache=true -t oracle/database-rac:$version-slim -f Dockerfile .
  3. イメージが正常にビルドされると、Dockerホストに作成されたイメージoracle/database-rac:19.16.0-slimが表示されます。

    # docker images
         REPOSITORY TAG IMAGE ID CREATED SIZE
         oracle/database-rac 19.16.0-slim 7d0a89984725 11 hours ago 359MB
         oraclelinux 7-slim f23503228fa1 3 days ago 120MB
  4. イメージをアーカイブ・ファイルに保存して、他のDockerホストに転送します。

    # docker image save -o /var/tmp/database-rac.tar oracle/database-rac:19.16.0-slim
    # scp /var/tmp/database-rac.tar docker-host-2:/var/tmp/database-rac.tar
    
  5. 他のDockerホストで、tarファイルからイメージをロードし、ロードされたことを確認します。

    # docker image load -i /var/tmp/database-rac.tar
    # docker images
         REPOSITORY TAG IMAGE ID CREATED SIZE
         oracle/database-rac 19.16.0-slim 7d0a89984725 20s ago 359MB
    

Docker上のOracle RACへの中央イメージ・リポジトリの使用

Dockerイメージのコンテナ・イメージ・リポジトリを設定することを選択できます。

Dockerホストが到達可能なコンテナ・イメージ・リポジトリがネットワーク上にある場合、Dockerイメージ上のOracle RACが1つのDockerホストで作成されると、リポジトリにプッシュしてすべてのDockerホストで使用できます。リポジトリの設定および使用の詳細は、Dockerドキュメントを参照してください。

Oracle ASM用の共有デバイスのプロビジョニング

Oracle Automatic Storage Management (Oracle ASM)用の記憶域デバイスはクリーン・ディスクを使用してプロビジョニングする必要があります。

Oracle Real Application Clustersの記憶域では、ブロック記憶域またはネットワーク・ファイル・システム(NFS)でOracle ASMを使用する必要があります。Docker上のOracle RACにOracle Advanced Storage Management Cluster File System (Oracle ACFS)を使用することはサポートされていません。

Oracle ASMに使用するデバイスには、既存のファイル・システムを含めないでください。デバイスの他の既存のファイル・システム・パーティションまたはマスター・ブート・レコードを上書きするには、次のようなコマンドを1つのDockerホストで使用します。

# dd if=/dev/zero of=/dev/sdd  bs=1024k count=1024
# dd if=/dev/zero of=/dev/sde  bs=1024k count=1024

このデプロイメントの例では、Dockerホスト・デバイス/dev/sddおよび/dev/sdeは両方のDockerホストで同じデバイス・パスに存在し、コンテナで/dev/asm-disk1および/dev/asm-disk2としてマップされます。このマッピングは、コンテナ作成手順「Oracle RACコンテナの作成」で行われます

DockerでのOracle RAC用のパブリック・ネットワークおよびプライベート・ネットワークの作成

この例では、Oracle Real Application Clusters (Oracle RAC)用のパブリック・ネットワークおよびプライベート・ネットワークを構成する方法を示します。

インストールを開始する前に、コンテナ内に少なくとも1つのパブリック・ネットワークおよび2つのプライベート・ネットワークを作成する必要があります。冗長プライベート・ネットワークを作成することをお薦めします。この例は、独自の構成のモデルとして使用しますが、ネットワーク・ドメインで構成するアドレスを使用します。

開発テストでは、次の構成を使用して、プライベートIPアドレスでネットワークが作成されます。

  • rac_eth0pub1_nw (10.0.20.0/24): パブリック・ネットワーク
  • rac_eth1priv1_nw (192.168.17.0/24): プライベート・ネットワーク1
  • rac_eth2priv2_nw (192.168.18.0/24): プライベート・ネットワーク2

デプロイメントに適した任意のネットワーク・サブネットを使用できます。ただし、このドキュメントの以降の他の例では、これらのネットワーク名およびアドレスを使用します。

Dockerホストで親ゲートウェイ・インタフェースを使用してパブリック・ネットワークを設定するには、Docker MACVLANまたはIPVLANドライバを使用して、マルチホスト用のDockerでOracle RACを実行する必要があります。また、使用するゲートウェイ・インタフェースは、Oracle Grid Infrastructureの単一クライアント・アクセス名(SCAN)およびホスト名を登録したドメイン・ネーム・サーバー(DNS)が解決先にできるものである必要があります。この例では、パブリック・ネットワークにmacvlanを使用し、様々なDockerホスト間でのOracle RACプライベート・ネットワーク通信にもmacvlanを使用しました。

--subnetオプションは、-o parentパラメータで指定された物理インタフェースに関連付けられたサブネットに対応している必要があります。-o parentパラメータでは、macvlanインタフェースを関連付ける物理インタフェースをリストする必要があります。--gatewayオプションは、物理インタフェースのネットワーク上のゲートウェイに対応している必要があります。詳細は、Dockerドキュメントを参照してください。

ネットワーク構成には、標準の最大転送単位(MTU)ネットワークとジャンボ・フレームMTUネットワークの2つのオプションがあります。Oracle RAC通信のパフォーマンスを向上させるために、ネットワーク・インタフェースに対してジャンボ・フレームを有効にし、MTUが1,500バイトを超えるようにすることをお薦めします。ジャンボ・フレームを有効にした場合、ネットワーク・デバイス・オプション・パラメータを使用して、ネットワークのMTUパラメータをジャンボフレームMTUと同じ値に設定できます。

例1-1 標準MTUネットワーク構成

各Dockerホストで次のコマンドを実行します。

# docker network create -d macvlan --subnet=10.0.20.0/24 --gateway=10.0.20.1 -o parent=eth0 rac_eth0pub1_nw
# docker network create -d macvlan --subnet=192.168.17.0/24 -o parent=eth1 rac_eth1priv1_nw
# docker network create -d macvlan --subnet=192.168.18.0/24 -o parent=eth2 rac_eth2priv2_nw

例1-2 ジャンボ・フレームMTUネットワーク構成

まず、ジャンボ・フレームMTU構成を確認します。たとえば:

# ip link show | egrep "eth0|eth1|eth2"
3: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
4: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000
5: eth2: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 9000 qdisc pfifo_fast state UP mode DEFAULT group default qlen 1000

各インタフェースでのMTUは9000に設定されるため、各Dockerホストで次のコマンドを実行して、MTU全体を使用するように各ネットワークの最大ペイロード長を拡張できます。

# docker network create -d macvlan \
--subnet=10.0.20.0/24 \
--gateway=10.0.20.1 \
-o parent=eth0 \
-o "com.docker.network.driver.mtu=9000" \
rac_eth0pub1_nw
# docker network create -d macvlan \
--subnet=192.168.17.0/24 \
-o parent=eth1 \
-o "com.docker.network.driver.mtu=9000" \
rac_eth1priv1_nw
# docker network create -d macvlan \
--subnet=192.168.18.0/24 \
-o parent=eth2 \
-o "com.docker.network.driver.mtu=9000" \
rac_eth2priv2_nw
 

DockerコンテナでOracle RACを実行するためにネットワークを設定するには、複数のパブリック・ネットワークと、3つ以上のプライベート・ネットワークまたは1つのプライベート・ネットワークのみの使用を選択できます。複数のネットワークを構成する場合、これらのネットワークを作成するには、ネットワークに適した値を使用してdocker network createコマンドを繰り返します。

ネットワークの作成後、コマンドdocker network lsを実行します。このコマンドの結果には、Dockerホストで作成されたネットワークが示されている必要があります。次のような結果が表示されます。


NETWORK ID    NAME              DRIVER   SCOPE
09a0cccfd773  bridge            bridge   local
881fe01c864d  host              host     local
0ed10efde310  none              null     local
bd42e49e6d95  rac_eth0pub1_nw   macvlan  local
846f22e74cee  rac_eth1priv1_nw  macvlan  local
876f275ffeda  rac_eth2priv2_nw  macvlan  local

デプロイ前に考慮するオプション

DockerにOracle RACをデプロイする前に、ネットワークおよびホストの構成オプションを確認します。

デプロイ前に、1つのプライベート・ネットワークを使用するか、複数のプライベート・ネットワークを構成するかを決定できます。次のいずれかのオプションを選択することもできます。

  • 複数のDockerホスト
  • 単一のDockerホスト上の複数のDockerブリッジ

使用するネットワーク構成オプションを決定したら、選択した構成のデプロイメント手順を完了します。

ノート:

このドキュメントでは、一般的な推奨されるブロック・デバイス記憶域およびネットワーク・オプションを示します。ただし、デプロイメント・トポロジおよび記憶域の可能性に応じて、DockerでのOracle RACのデプロイ要件により適した他のオプションを検討できます。

DockerでのOracle RACの記憶域用のNFSの構成

記憶域にNFSを使用する場合は、この手順を使用してNFSボリュームを作成し、Oracle RACコンテナで使用できるようにします。

NFSボリュームは、その使用に対してサポートされているマウント・オプションを使用して作成すると、コンテナで使用できます。

たとえば、クラスタ共有記憶域として使用できるNFSボリュームを作成するには、このコマンドを使用できます(nfs-serverはNFSサーバーのIPまたはホスト名です)。

docker volume create --driver local \
--opt type=nfs \
--opt o=addr=nfs-server,rw,bg,hard,tcp,vers=3,timeo=600,rsize=32768,wsize=32768,actimeo=0,noac \
--opt device=:/oradata \
racstorage

この場合、Docker docker container createコマンドで次の引数を指定します。


  --volume racstorage:/oradata \

これらの例のコマンドが実行され、Dockerコンテナがボリューム引数を使用して作成されると、コンテナの稼働時に/oradataにあるNFSファイル・システムにアクセスできます。

DockerでのOracle RACの複数のプライベート・ネットワーク・オプション

デプロイの前に、DockerでOracle RACに複数のプライベート相互接続を使用する場合は、プライベート・インターコネクトに複数のNICを使用できるようにDockerコンテナの作成を変更します。

Oracle Real Application Clusters (Oracle RAC)に複数のプライベート・ネットワークを使用する場合は、チューニング可能なrp_filter0または2に設定する必要があります。rp_filter値を設定するには、コンテナの作成時にdocker createコンテナ・コマンドにチューニング可能な引数を追加します。

--sysctl 'net.ipv4.conf.private_interface_name.rp_filter=2'

以前に構成したパブリック・ネットワークおよびプライベート・ネットワークへの接続順序に基づいて、このコマンドで定義するプライベート・インタフェース名を予測できます。

たとえば、このガイドのプライベート・ネットワークrac_eth1priv1_nwは、パブリック・ネットワークの後に接続されます。rac_eth1priv1_nwに対して構成されたインタフェース名がeth1である場合、イーサネット・ネットワーク・インタフェースは接続の順序によって割り当てられるため、インタフェースでの2つ目のプライベート・ネットワーク接続はインタフェース名eth2になります。

この場合、docker container createコマンドで次の引数を指定します。

--sysctl 'net.ipv4.conf.eth1.rp_filter=2' --sysctl 'net.ipv4.conf.eth2.rp_filter=2'. 

複数のDockerホスト・オプション

複数のDockerホストを使用する場合は、この例のようなコマンドを使用してネットワーク・ブリッジを作成します。

外部ネットワークへの接続には、(引数-o parent=adapter nameを使用して)親アダプタとともにDocker MACVLANドライバを使用する必要があります。

# docker network create -d macvlan --subnet=10.0.20.0/24 --gateway=10.0.20.1 -o parent=eth0 rac_eth0pub1_nw 
# docker network create -d macvlan --subnet=192.168.17.0/24 -o parent=eth1 rac_eth1priv1_nw

ノート:

各DockerホストのDockerイメージでOracle RACを構築するプロセスを繰り返さない場合は、1つのDockerホストでDockerイメージを作成し、そのイメージをアーカイブ・ファイルにエクスポートできます。このオプションを使用するには、イメージを作成するDockerホストでdocker image saveコマンドを実行し、アーカイブ・ファイルを他のDockerホストに転送します。次に、これらのDockerホストではdocker image loadコマンドを使用してイメージをインポートできます。これらのコマンドの詳細は、Dockerドキュメントを参照してください。

単一のDockerホスト上の複数のDockerブリッジ・オプション

使用している環境でMACVLANドライバを使用できない場合は、この例を使用して、単一のホストにDockerブリッジを作成する方法を確認できます。

使用している環境でMACVLANドライバを使用できない場合でも、Dockerブリッジを環境に作成できます。ただし、このブリッジは外部ネットワークから到達できません。また、特定のクラスタ用のOracle RAC Dockerコンテナは同じDockerホスト内に限定されます。

Dockerホストと同様にログインし、次のようなコマンドを使用します。

# docker network create --driver=bridge --subnet=10.0.20.0/24 rac_eth0pub1_nw
# docker network create --driver=bridge --subnet=192.168.17.0/24 rac_eth1priv1_nw

Oracle RACコンテナの作成

Oracle Real Application Clusters (Oracle RAC)コンテナを作成するには、これらの例のようなdocker createコマンドを実行します。

ブロック・デバイスを使用したRacnode1コンテナの作成

この手順を使用して、docker-host-1のDockerに1つ目のOracle Real Application Clusters (Oracle RAC)コンテナを作成します。

このコンテナ構成の例をガイドラインとして使用してください。Oracle RAC用に作成するコンテナには、Oracle RACクラスタについて予想されるデータベース・ワークロードに対応するために、コンピュート、メモリーおよび記憶域のリソースを明示的に割り当てる必要があります。したがって、--cpuset-cpu--memoryおよび--device --dnsの値を、ワークロード環境に必要な値に変更します。--dnsで指定したドメイン・ネーム・サーバー(DNS)が、Oracle Grid Infrastructureに使用する予定のホスト名および単一クライアント・アクセス名(SCAN)を解決できることを確認します。また、デフォルトのDockerコンテナ停止では、コンテナ停止コマンドが発行されたときにSIGTERMシグナルを使用してコンテナに送信します。ただし、Docker SIGTERMシグナルはコンテナ内のsystemdサービスを停止しません。Oracle Clusterwareは、systemdサービス停止によるクラスタ・ノードの正常な停止をサポートしています。Dockerコンテナの停止がOracle Clusterwareでsystemdサービスの停止をトリガーできるようにするには、引数--stop-signal=SIGRTMIN+5docker createコマンドに含めます。次のコマンドで説明されているすべてのオプションを理解するには、DockerホストにインストールされているOracle DockerバージョンのDockerドキュメントを参照してください。手動コマンドを使用してコンテナを正常に停止することもできます。このドキュメントのRACコンテナを正常に停止する方法を参照してください。

# docker create -t -i \
  --hostname racnode1 \
  --volume /boot:/boot:ro \
  --volume /dev/hugepages:/dev/hugepages \
  --volume /dev/shm \
  --tmpfs /dev/shm:rw,exec,size=2G \
  --dns-search=example.info \
  --dns=162.88.2.6 \
  --device=/dev/sdd:/dev/asm-disk1  \
  --device=/dev/sde:/dev/asm-disk2  \
  --privileged=false  \
  --volume /scratch/software/stage:/software/stage \
  --volume /scratch/rac/cluster01/node1:/u01 \
  --volume /sys/fs/cgroup:/sys/fs/cgroup: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 \
  --sysctl 'net.ipv4.conf.eth1.rp_filter=2' \
  --sysctl 'net.ipv4.conf.eth2.rp_filter=2' \
  --cap-add=SYS_NICE \
  --cap-add=SYS_RESOURCE \
  --cap-add=NET_ADMIN \
  --restart=always \
  --tmpfs=/run \
  --cpu-rt-runtime=95000 \
  --stop-signal=SIGRTMIN+5 \
  --ulimit rtprio=99  \
  --name racnode1 \
oracle/database-rac:19.16.0-slim

ブロック・デバイスを使用したRacnode2コンテナの作成

この手順を使用して、docker-host-2のDockerに2つ目のOracle Real Application Clusters (Oracle RAC)コンテナを作成します。

この例をDockerホストで使用するには、--cpuset-cpu--memoryおよび--device --dnsの値を使用している環境に適した値に変更します。--dnsで指定したドメイン・ネーム・サーバー(DNS)が、Oracle Grid Infrastructureに使用する予定のホスト名および単一クライアント・アクセス名(SCAN)を解決できることを確認します。また、デフォルトのDockerコンテナ停止では、コンテナ停止コマンドが発行されたときにSIGTERMシグナルを使用してコンテナに送信します。ただし、Docker SIGTERMシグナルはコンテナ内のsystemdサービスを停止しません。Oracle Clusterwareは、systemdサービス停止によるクラスタ・ノードの正常な停止をサポートしています。Dockerコンテナの停止がOracle Clusterwareでsystemdサービスの停止をトリガーできるようにするには、引数--stop-signal=SIGRTMIN+5docker createコマンドに含めます。次のコマンドで説明されているすべてのオプションを理解するには、DockerホストにインストールされているOracle DockerバージョンのDockerドキュメントを参照してください。手動コマンドを使用してコンテナを正常に停止することもできます。このドキュメントのRACコンテナを正常に停止する方法を参照してください。

# docker create -t -i \
  --hostname racnode2 \
  --volume /boot:/boot:ro \
  --volume /dev/hugepages:/dev/hugepages \
  --volume /dev/shm \
  --tmpfs /dev/shm:rw,exec,size=2G \
  --dns-search=example.info \
  --dns=162.88.2.6 \
  --device=/dev/sdd:/dev/asm-disk1  \
  --device=/dev/sde:/dev/asm-disk2  \
  --privileged=false  \
  --volume /scratch/rac/cluster01/node2:/u01 \
  --volume /sys/fs/cgroup:/sys/fs/cgroup: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 \
  --sysctl 'net.ipv4.conf.eth1.rp_filter=2' \
  --sysctl 'net.ipv4.conf.eth2.rp_filter=2' \
  --cap-add=SYS_NICE \
  --cap-add=SYS_RESOURCE \
  --cap-add=NET_ADMIN \
  --restart=always \
  --tmpfs=/run \
  --cpu-rt-runtime=95000 \
  --ulimit rtprio=99  \
  --name racnode2 \
oracle/database-rac:19.16.0-slim

共有メモリー・ファイル・システム・マウントの確認

このコマンドを使用して共有メモリーのマウントを確認します。

共有メモリー(/dev/shm)が十分なサイズでマウントされていることを確認します。これらの手順は4 GBでテストされました。

たとえば:

# df -h /dev/shm

df -hコマンドでは、/dev/shmがマウントされているファイル・システムと、共有メモリーの総容量および空き容量がGBで表示されます。

ネットワークの接続とDockerコンテナの起動

コンテナを起動する前に、パブリック・ネットワークとプライベート・ネットワークを設定し、ネットワークをOracle RACコンテナに割り当てます。

Oracle RACコンテナへのネットワークの割当て

次の手順を使用して、DockerコンテナのOracle RACで作成した各Oracle Real Application Clusters (Oracle RAC)ノードにネットワークを割り当てます。

各ノードで特定のネットワークに使用されるネットワーク・インタフェース名を必ず同じになるようにするには、各ノードで、関連付けられたネットワークに対してまったく同じ順序の切断および接続のコマンドを使用する必要があります。たとえば、すべてのノードで一貫してeth0インタフェースはパブリックです。eth1インタフェースは1つ目のプライベート・ネットワーク・インタフェースであり、eth2インタフェースは2つ目のプライベート・ネットワーク・インタフェースです。

docker-host-1では、ネットワークをracnode1に割り当てます。

# docker network disconnect bridge racnode1
# docker network connect rac_eth0pub1_nw --ip 10.0.20.150 racnode1
# docker network connect rac_eth1priv1_nw --ip 192.168.17.150  racnode1
# docker network connect rac_eth2priv2_nw --ip 192.168.18.150  racnode1

docker-host-2では、ネットワークをracnode2に割り当てます。

# docker network disconnect bridge racnode2
# docker network connect rac_eth0pub1_nw --ip 10.0.20.151 racnode2
# docker network connect rac_eth1priv1_nw --ip 192.168.17.151  racnode2
# docker network connect rac_eth2priv2_nw --ip 192.168.18.151  racnode2

コンテナの起動

Docker環境でOracle RACを有効にするには、コンテナを起動します。

docker-host-1の場合

# docker start racnode1

docker-host-2の場合

# docker start racnode2

Oracle Grid InfrastructureおよびOracle Databaseソフトウェアのダウンロード

Oracle Technology NetworkからOracle DatabaseおよびOracle Grid Infrastructureソフトウェアをダウンロードし、ステージングします。

コンテナの作成方法として、ステージングされたダウンロード・ファイルにコンテナがアクセスするためにプロビジョニングされたDockerボリュームがあります。ステージ・ボリュームは、racnode1に対してのみプロビジョニングする必要があります。docker container createコマンドのこの行により、ボリュームが作成されます。

--volume /scratch/software/stage:/software/stage \
  • Oracle Database 19c Grid Infrastructure (19.3) for Linux x86-64 (LINUX.X64_193000_grid_home.zip)
  • Oracle Database 19c (19.3) for Linux x86-64 (LINUX.X64_193000_db_home.zip)
  • Oracle Grid Infrastructure 19.16 GIRU、パッチ34130714
  • パッチ34339952、Oracle Grid Infrastructure 19.16上にパッチ適用
  • パッチ32869666、Oracle Grid Infrastructure 19.16上にパッチ適用
  • 最新のOPatchバージョン(このリリースの時点では、p6880880_190000_Linux-x86-64.zip)

ソフトウェアをDockerホストにダウンロードして/scratch/software/stageフォルダにステージングし、コンテナ内でこれらのファイルが/software/stageでアクセスできるようにします。

https://www.oracle.com/database/technologies/

コンテナへのOracle Grid InfrastructureおよびOracle RACのデプロイ

コンテナを準備したら、標準のOracle Grid InfrastructureおよびOracle Real Application Clusters (Oracle RAC)デプロイメントを完了します。

プラットフォーム固有のインストール・ガイドの指示に従って、Oracle Grid Infrastructureをインストールして構成し、Oracle Real Application Clusters (Oracle RAC)をデプロイします。

デプロイ後に考慮するオプション

DockerコンテナにOracle Real Application Clusters (Oracle RAC)をデプロイした後に、Oracle RACノードの追加または削除、あるいは異なるリリースのOracle RACのインストールを選択できます。

Oracle RACノードの追加

Oracle RACコンテナで実行されている既存のOracle RACクラスタでOracle RACノードを追加するには、このドキュメントの「DBCAを使用したOracle RACデータベースの作成」で説明されているのと同じ方法でコンテナを作成しますが、コンテナの名前とホスト名を変更する必要があります。その他に必要なステップは、Oracle Grid Infrastructureドキュメントを参照してください。

環境の再作成: 同一または異なるリリース

Oracleは、Oracle Database 19cのDocker上でOracle RACをサポートしています。Oracle Database 19cの後に他のバージョンをインストールするには、インストールするリリースのDockerでのOracle RACのインストール・ガイドを参照してください。

DockerでのOracle RACの既知の問題

DockerコンテナにOracle Real Application Clusters (Oracle RAC)をデプロイする際、問題が発生した場合は、既知の問題かどうかを確認してください。

DockerデプロイメントのOracle RACに固有の問題については、My Oracle SupportドキュメントID 2488326.1を参照してください。

Docker上のOracle RAC構成に関する追加情報

この情報は、Docker上のOracle Real Application Clusters (Oracle RAC)で発生する可能性のある問題の解決に役立ちます。

Oracle RACのインタフェース名をリカバリする方法

コンテナ上のOracle RACノードでネットワーク・インタフェース名が表示されなくなり、別のインタフェース名が作成された場合は、この手順を使用して名前をリカバリします。

Oracle Real Application Clusters (Oracle RAC)を実行しているコンテナのネットワークが切断された場合、同じネットワークを再接続すると、Oracle RACノードでネットワーク・インタフェース名が表示されなくなる可能性があります。前のネットワーク・インタフェースのかわりに、別のインタフェース名が作成されます。このシナリオが発生した場合、その結果はOracle Clusterwareのネットワーク構成と矛盾するネットワーク構成になります。そのネットワーク・インタフェースがクラスタ・ノードの唯一のプライベート・インタフェースである場合、そのノードはクラスタから削除できます。

この問題を修正するには、この手順を使用して、コンテナでネットワーク・インタフェース名をリストアし、Oracle Clusterwareで最初に構成した同じネットワーク・インタフェース名にします。

  1. コンテナを停止します。
  2. すべてのネットワークを切断します。
  3. Oracle Grid Infrastructureインストール用にコンテナを作成して構成したときに使用したのと同じ順序でネットワークを再接続します。
  4. コンテナを再起動します。
この手順を完了すると、コンテナ上のOracle RACノードのネットワーク・インタフェース名が元の構成にリストアされ、Oracle Clusterwareの構成と一致します。

Dockerネットワークで使用されるNICアダプタを交換する方法

Dockerホストの外部にある物理ネットワークでネットワーク・インタフェース・カード(NIC)を交換する必要がある場合は、この手順を使用します。

Oracle RACのパブリック・ネットワークまたはプライベート・ネットワークがDockerホストの外部にある物理ネットワークに接続されている場合、対応するDockerネットワークでは、DockerホストのNICアダプタを親アダプタとして使用して、LinuxブリッジをバイパスするMacvlanモードを使用します。

構成後に、Oracle Real Application Clusters (Oracle RAC)を実行しているコンテナのネットワークで使用されるNICカードを切断して交換する必要がある場合、同じネットワークを再接続すると、Oracle RACノードでネットワーク・インタフェース名が表示されなくなる可能性があります。前のネットワーク・インタフェース名のかわりに、別のインタフェース名が作成されます。このシナリオが発生した場合、その結果はOracle Clusterwareのネットワーク構成と矛盾するネットワーク構成になります。そのネットワーク・インタフェースがクラスタ・ノードの唯一のプライベート・インタフェースである場合、そのノードはクラスタから削除できます。

この問題を解決するには、次の手順を使用します。

  1. ノードでOracle Clusterwareを無効にしてから停止します。

    # crsctl disable crs
    # crsctl stop crs
  2. 交換するホストNICに対応するネットワークからコンテナを切断します。たとえば、コンテナ名がmycontainerで、ネットワーク名がmypriv1の場合は、次のコマンドを入力します。
    
    # docker network disconnect mycontainer mypriv1
  3. ホストNICを交換し、新しいNICが検出され、ホストで使用可能であり、ホスト・オペレーティング・システムのデバイス名が検出されることを確認します。NIC名は、以前とは異なる場合があります。ホスト環境によっては、このステップでホスト・オペレーティング・システムの再起動が必要になる場合があります。たとえば、NICデバイス名が以前はeth1であった場合、交換後はeth3になることがあります。
  4. 検出したNICデバイス名を使用してネットワークを再作成します。たとえば、ネットワーク名がmypriv1で、以前はeth1だったNICが現在はeth3である場合です。
    # docker network rm mypriv1
    # docker network create .... -o parent=eth3 mypriv1
  5. コンテナを停止します。
  6. 他のネットワークをコンテナから切断します。
  7. コンテナを最初に作成したときに使用したのと同じ順序で、すべてのネットワークをコンテナに再接続します。同じ順序でネットワークを接続すると、コンテナ内のインタフェース名は交換前と必ず同じになります。
  8. コンテナを起動し、ネットワーク・インタフェース名とIPアドレスが、最初にコンテナを作成したときと同じであることを確認します。
  9. ノードでClusterwareを再起動して有効にします。
    # crsctl enable crs
    # crsctl start crs

DockerでOracle RACをクリーン・アップする方法

DockerでOracle Real Application Clusters (Oracle RAC)を削除する必要がある場合は、この手順を使用します。

DockerでOracle RACを削除するには、まずOracleソフトウェアを停止して削除してから、Dockerを構成解除します。
  1. 各コンテナで、クラスタを停止し、クラスタからOracle RACインスタンスを削除し、Oracle Clusterwareノードを削除します。
  2. Oracle Grid InfrastructureおよびOracle RACソフトウェアを削除します。
  3. Oracleソフトウェアの削除後、Dockerホストで各コンテナについてDockerコンテナ削除コマンドを実行します。

    たとえば:

    # docker container stop racnode1
    # docker container rm racnode1

Oracle RACノードに使用したコンテナを削除した後、そのコンテナを再作成すると、マウント・ポイントに同じボリューム(/u01)を使用しても、そのコンテナはOracle RACノードではありません。コンテナを再度Oracle RACノードにするには、Oracle Grid Infrastructureインストレーションおよびアップグレード・ガイドfor LinuxおよびOracle Real Application Clusters管理およびデプロイメント・ガイドのノードの削除手順とノードの追加手順を使用します。

docker image pruneを使用したDockerイメージのクリーン・アップ

Dockerサーバー上のOracle RACでDockerイメージをクリーン・アップする必要がある場合は、docker image pruneコマンドを使用できます。

通常、Dockerのオブジェクトは、明示的に削除しないかぎり削除されません。docker image pruneコマンドを使用してDockerイメージでOracle RACを削除する方法は、Dockerドキュメントを参照してください。

未使用のDockerオブジェクトのプルーニング

Dockerホストの再起動後のOracle RACノードの可用性を保証する方法

再起動後のOracle RACノードの可用性を保証するには、Dockerサービスを有効にしておきます。

デフォルトでは、Dockerエンジンのインストール後、DockerサービスはDockerホストで有効になっています。このサービスは、DockerホストでOracle RACノードの可用性を保証するために有効のままにしておく必要があります。Dockerサービスが有効になっている場合、Dockerホストが再起動されると、計画メンテナンスによるものであれ計画外停止のためであれ、Dockerサービスも再起動されます。Dockerサービスは管理対象のコンテナを自動的に再起動するため、Oracle RACノード・コンテナは自動的に再起動されます。Oracle Clusterware (CRS)が自動再起動に対して有効になっている場合、Dockerは再起動されたノードでOracle Clusterwareの起動も試みます。

Oracle RACコンテナを正常に停止する方法

DockerコンテナでOracle Real Application Clusters (Oracle RAC)を正常に停止するには、この手順を使用します。

コンテナ内のCluster Ready Services (CRS)スタックを停止してからコンテナを停止するか、コンテナ内のOracle RACの正常な停止に十分な猶予期間を使用して、ホストから直接コンテナを停止することによって、コンテナを正常に停止できます。

例1-3 CRSスタックおよびコンテナの停止による正常な停止

CRSスタックを正常に停止してからコンテナを停止するには、次のステップを実行します。
  1. コンテナ内のCRSスタックを停止します。たとえば:

    [root@racnode1 ~]# crsctl stop crs
  2. ホストからコンテナを停止します。たとえば:

    # docker stop racnode1

例1-4 猶予期間を設定してホストからコンテナを停止することによる正常な停止

猶予期間を使用してホストから直接コンテナを停止するには、コンテナ内のOracle RACの正常な停止に十分な秒数のタイムアウトが必要です。たとえば:

# docker stop -t 600 racnode1

ノート:

コンテナが、指定した猶予期間(秒)よりも早く正常に停止できる場合、コマンドは猶予期間の制限前に完了します。

Dockerホスト・オペレーティング・システムのアップグレードのためのガイドライン

可用性要件を満たし、Oracle RAC on Docker InstallationのOracle Linuxオペレーティング・システム要件を満たすオペレーティング・システムおよびサーバーのアップグレード・オプションを選択します。

Dockerホスト・オペレーティング・システムにパッチを適用またはアップグレードできます。マルチDockerホスト構成では、ローリング方式でDockerホストをアップグレードできます。単一のDockerホスト上のDockerのOracle RACは開発およびテスト環境用であるため、可用性は問題にならないので、DockerデータベースのOracle RACを新しいアップグレードされたDockerホストに移行できます。

ノート: サーバー・オペレーティング・システムがサポートされ、Dockerホスト・オペレーティング・システムのカーネルおよびパッケージの要件がOracle Container Runtime for Dockerの最小要件を満たしていることを確認します。