WSL2 の Docker で Oracle DB 19c(練習用) を構築する

[前回](https://qiita.com/blueskyarea/items/ef262768c8f8f2ebe990)、WSL2 に Docker Engine をインストールしました。
この Docker Engine を使って、Oracke DB 19c を構築していきます。
※このDBは、Oracle DB 19c の練習用に使うつもりのため、Oracle が提供しているサンプルデータベースファイル（サンプルのテーブルやレコードのセット）を設置していきます

#### 目次（流れ）
1. Build Oracle DB 19c Docker Image
2. Create Oracle DB Container
3. Test

<font color="Red">注）
この作業を行うためには、およそ 25GB以上のストレージ空き容量が必要です</font>

#### 1. Build Oracle DB 19c Docker Image
##### 1-1 Oracle DB Docker Images ダウンロード
※ここには、Oracle DB Docker Image をビルドするためのスクリプトなどが入っています

```
$ git clone https://github.com/oracle/docker-images.git
Cloning into 'docker-images'...
remote: Enumerating objects: 15204, done.
remote: Counting objects: 100% (66/66), done.
(略)
```

##### 1-2 Oracle DB 19c DB ソフトウェア ダウンロード
※ダウンロードするためには、Oracle アカウント（無料作成可）が必要になります
https://www.oracle.com/jp/database/technologies/oracle-database-software-downloads.html
![oracledbdownload.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/63951/6ea6c272-dcdd-57d7-7f3a-a016535737db.png)

##### 1-3 Docker image ビルド
ダウンロードしたファイル（ファイル名：LINUX.X64_193000_db_home.zip）を以下(19.3.0ディレクトリ内)に設置します。

```:git_cloneでダウンロードしたディレクトリ内
{任意のパス}/docker-images/OracleDatabase/SingleInstance/dockerfiles/19.3.0/
```

```:こんな状態に配置
{任意のパス}/docker-images/OracleDatabase/SingleInstance/dockerfiles/19.3.0/LINUX.X64_193000_db_home.zip
```

以下のコマンドでビルドが開始されます。
環境に依りますが、所要時間30分、ストレージ使用が20GBほど消費されます。

```
$ sudo {任意のパス}/docker-images/OracleDatabase/SingleInstance/dockerfiles/buildContainerImage.sh -v 19.3.0 -e -i
(略)
Step 22/22 : CMD exec $ORACLE_BASE/$RUN_FILE
 ---> Running in e1807b43247b
Removing intermediate container e1807b43247b
 ---> 3de1d8a5a85b
Successfully built 3de1d8a5a85b
Successfully tagged oracle/database:19.3.0-ee
```

```:DockerImageが出来た
$ docker images
REPOSITORY        TAG         IMAGE ID       CREATED          SIZE
oracle/database   19.3.0-ee   3de1d8a5a85b   52 minutes ago   6.54GB
```

#### 2. Create Oracle DB Container
##### 2-1 docker-compose ファイル作成
コンテナ作成・起動用の docker-compose ファイルを用意します

```:docker-compose.yml
version: '3'
services:
  do:
    image: oracle/database:19.3.0-ee
    container_name: myoracledb19
    ports:
      - 1521:1521
      - 5500:5500
    volumes:
      - ./oradata:/opt/oracle/oradata
      - ./startup:/opt/oracle/scripts/startup
    environment:
      - ORACLE_PWD=oraclepass
      - ORACLE_PDB=ORCLPDB1
```
補足）
- ports 1521: ORACLE DBへの接続は1521ポートを使用するのが慣例
- ports 5500: Oracle Enterprise Manager Database Console の HTTPポート
- volumes startup: Oracle 公式startup ファイルの設置用
- environment ORACLE_PWD: 任意のパスワードでOK
- environment ORACLE_PDB: コンテナ作成時に作られるPDB名（ORCLPDB1 で設定されているのをよく見かける）

##### 2-2 Oracle サンプルデータベース ファイルの設置

```:ディレクトリ作成
$ mkdir oradata startup
※docker-compose.yml のあるディレクトリに作成

$ chmod 777 ./oradata
※好ましくはないですが、コンテナからの書き込みを容易に実現するために権限をフルに
```

```:ディレクトリ作成後例
$ ls
docker-compose.yml  docker-images  oradata  startup
```

サンプルデータベース ファイルをダウンロードして、startup ディレクトリ内に設置します。
https://www.oracletutorial.com/wp-content/uploads/2019/01/oracle-sample-database.zip

```:設置後
$ ls startup/
01_ot_create_user.sql  02_ot_schema.sql  03_ot_data.sql
※ot_drop.sql は今回は使いません
```

##### 2-3 Oracle DB コンテナ作成・起動

```
$ docker-compose up -d
Creating network "docker-oracledb_default" with the default driver
Creating myoracledb19 ... done

※ログを監視(初回は20分ほどかかる)
$ docker-compose logs -ft
(略)
myoracledb19 | 2022-xx-xxTxx:xx:xx.807396600Z The Oracle base remains unchanged with value /opt/oracle
myoracledb19 | 2022-xx-xxTxx:xx:xx.896814600Z The Oracle base remains unchanged with value /opt/oracle
myoracledb19 | 2022-xx-xxTxx:xx:xx.950470100Z #########################
myoracledb19 | 2022-xx-xxTxx:xx:xx.950533000Z DATABASE IS READY TO USE!
myoracledb19 | 2022-xx-xxTxx:xx:xx.950544300Z #########################
(略)
myoracledb19 | 2022-xx-xxTxx:xx:xx.031394300Z XDB initialized.
myoracledb19 | 2022-xx-xxTxx:xx:xx.031457600Z ORCLPDB1(3):Resize operation completed for file# 10, old size 327680K, new size 337920K
```

#### 3. Test
##### 3-1 動作確認

sqlplus(OracleDBクライアントツール）を起動してみます。
"oraclepass" は、docker-compose で指定したパスです。
"ORCLCDB" は、固定値。（docker-compose で指定したPDBとは違う）

```:sqlplus
$ docker exec -it myoracledb19 sqlplus SYSTEM/oraclepass@ORCLCDB
SQL*Plus: Release 19.0.0.0.0 - Production on Sun Jan 30 03:40:01 2022
Version 19.3.0.0.0

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

Last Successful login time: Sat Jan 22 2022 00:49:58 +00:00

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

SQL>
```

```:現在接続しているコンテナ名を表示
SQL> SHOW con_name;
CON_NAME
------------------------------
CDB$ROOT
```

"CDB\$ROOT" という名前のルート・コンテナに接続できていることが確認できました。
どのCDBにも、CDB\$ROOTという名前のルート・コンテナが1つ存在しています。
ここには、PDBの管理に必要なシステム・メタデータが格納されていて、すべてのPDBはこのルート・コンテナに属しているようです。

こういった練習環境をローカルに用意しておけば、気軽にコマンドを試したり、表示された内容を調べることが出来るので、理解が深まりやすいと思います。