Oracle検証環境をDocerで構築した話

# Oracle19cをWindows11にインストール

## 目次

1. [インストール証跡](#インストール証跡)
1. [触ってみる](#触ってみる)
1. [参考](#参考)
1. To be continued...


## オリジナルイメージの作成

### :scroll: やりたいこと

Oracle19cの検証環境（個人用に好き勝手に遊んでいい環境）を作って本で読んだ知識をハンズオン形式に学習したい

### :hammer: やったこと

ローカルを汚染したくない、かつリ簡単にビルドできるようにしたい（環境を作っては捨て、作っては捨てるサイクルをサクッとやりたい）ので、流行りのコンテナを使用して環境構築する。

### 前提

- Windows11 HomeにDocker Desktopをインストールしてコンテナを構築します
- シェルスクリプトファイルを実行するため、Linux環境（WSL2）が必要です
- Oracle Database 19c for Linux x86-64をコンテナにインストールします
- Docker Desktop：4.27.2
- エディタは、Vscodeを使用します。

:::note warn
本記事では、Docker Desktop及びWSL2をインストール済みという前提で進みます。
未インストールの場合は、インストール後に戻ってきてください。
:::


### :inbox_tray: gitからDocker imageをclone

```console:gitからDocker imageをclone
C:\OracleTest>git clone https://github.com/oracle/docker-images.git
Cloning into 'docker-images'...
remote: Enumerating objects: 17584, done.
remote: Counting objects: 100% (2158/2158), done.
remote: Compressing objects: 100% (408/408), done.
remote: Total 17584 (delta 1844), reused 1895 (delta 1738), pack-reused 15426
Receiving objects: 100% (17584/17584), 15.11 MiB | 16.92 MiB/s, done.
Resolving deltas: 100% (10369/10369), done.
```

### :inbox_tray: Oracle公式から19cをダウンロード

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407942/6bce9088-4fb2-d16e-d1d2-873958886f12.png)


### オリジナルImageの作成

提供されているシェルスクリプトファイルを実行してオリジナルImageを作成します。
:exclamation: Windowsではシェルスクリプトファイルを実行できないので、Ubuntuで実行します。


```bash:オリジナルImageの作成
<ユーザ名>@<ホスト名>:/mnt/c/oracletest/docker-images/oracledatabase/singleinstance/dockerfiles$ ./buildContainerImage.sh -v 19.3.0 -e -i

# ～省略～

Server:
 Containers: 1
  Running: 0
  Paused: 0
  Stopped: 1
 Images: 3
 Server Version: 25.0.3
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Using metacopy: false
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: ae07eda36dd25f8a1b98dfbf587313b99c0190bb
 runc version: v1.1.12-0-g51d5e94
 init version: de40ad0
 Security Options:
  seccomp
   Profile: unconfined
 Kernel Version: 5.15.133.1-microsoft-standard-WSL2
 Operating System: Docker Desktop
 OSType: linux
 Architecture: x86_64
 CPUs: 16
 Total Memory: 15.59GiB
 Name: docker-desktop
 ID: 1fb14317-26a9-4536-906c-7e20c71815d4
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 HTTP Proxy: http.docker.internal:3128
 HTTPS Proxy: http.docker.internal:3128
 No Proxy: hubproxy.docker.internal
 Experimental: false
 Insecure Registries:
  hubproxy.docker.internal:5555
  127.0.0.0/8
 Live Restore Enabled: false

# ～省略～

What's Next?
  View a summary of image vulnerabilities and recommendations → docker scout quickview


  Oracle Database container image for 'ee' version 19.3.0 is ready to be extended:

    --> oracle/database:19.3.0-ee

  Build completed in 551 seconds.

<ユーザ名>@<ホスト名>:/mnt/c/oracletest/docker-images/oracledatabase/singleinstance/dockerfiles$
```

:white_check_mark: Docker DesktopのImagesに`oracle/database`が追加されている。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/407942/7733ae39-c930-4f8e-3953-6724d5bfe79d.png)

:white_check_mark: コンソールからもImageを確認

```powershell:docker images
PS C:\OracleTest\docker-images\OracleDatabase\SingleInstance\dockerfiles> docker images
REPOSITORY                               TAG               IMAGE ID       CREATED          SIZE
oracle/database                          19.3.0-ee         f3483ed6fa25   22 minutes ago   6.54GB
```

### :hammer: コンテナの確認

```powershell:docker container ls
PS C:\OracleTest> docker container ls   
CONTAINER ID   IMAGE                       COMMAND                  CREATED         STATUS                            PORTS                                            NAMES
60d91216cedd   oracle/database:19.3.0-ee   "/bin/bash -c 'exec …"   5 minutes ago   Up 5 minutes (health: starting)   0.0.0.0:1521->1521/tcp, 0.0.0.0:5500->5500/tcp   oracledb19-20240320
```

## 触ってみる

### ユーザを作ってみる

ユーザを作成するため、`SYS`ユーザでログインします。
OS認証されてるか確認するため、自分のOSユーザ名をまず確認します。

```powershell:コンテナに入り込む
PS C:\OracleTest> docker exec -it oracledb19-20240320 bash
bash-4.2$ 
```

:::note info
以後、コンテナ内の環境でコマンドを色々と実行していくため、Powershellからコンテナに入り込んでいます。Docker Desktopからコマンド叩いても同じなので、お好きな方でどうぞ。
:::


```bash:カレントOSユーザの確認
bash-4.2$ whoami
oracle # OSユーザは「oracle」
```

次に、`oracle`というOSユーザがdbaグループに所属しているか確認します。

```bash:dbaグループにOSユーザのoracleがある
bash-4.2$ grep 'dba' /etc/group
dba:x:54322:oracle # OSユーザのoracleは、dbaグループに所属していることが分かる
backupdba:x:54324:oracle
dgdba:x:54325:oracle
kmdba:x:54326:oracle
racdba:x:54330:oracle
```

カレントOSユーザの`oracle`が`dba`グループに所属していることがわかったので、OS認証で`SYS`にログインできます。

```bash:SYSでログイン
bash-4.2$ sqlplus / as sysdba # OS認証でログイン

SQL*Plus: Release 19.0.0.0.0 - Production on Wed Mar 20 11:19:24 2024
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 user
USER is "SYS" # SYSユーザでログインできている
```

```sql:コンテナの確認
SQL> show con_name; 

CON_NAME
------------------------------
CDB$ROOT -- CDBのルート
```

```sql:PDBの確認
SQL> select pdb_id, pdb_name from cdb_pdbs order by pdb_id;

    PDB_ID PDB_NAME
---------- --------------------------------------------------------------------------------------------------------------------------------
         2 PDB$SEED
         3 ORCLPDB1 -- docker-compose.yamlで定義したPDB
```

```sql:PDBに接続
SQL> alter session set container = ORCLPDB1;

Session altered.

SQL> show con_name;

CON_NAME
------------------------------
ORCLPDB1
```

```sql:検証用ユーザ作成
SQL> create user user01 identified by password#1;

User created.
```

ユーザを作っただけではログインできないので、セッション権限を付与。

```sql:CREATE SESSION権限付与
SQL> grant create session to user01;

Grant succeeded.

SQL> SELECT * FROM DBA_SYS_PRIVS WHERE GRANTEE='USER01';

GRANTE PRIVILEGE                                ADM COM INH
------ ---------------------------------------- --- --- ---
USER01 CREATE SESSION                           NO  NO  NO
```

## 参考

```bash:Oracle Homeの場所
bash-4.2$ echo $ORACLE_HOME
/opt/oracle/product/19c/dbhome_1
```

```sql:spfileのディレクトリ
SQL> show parameter spfile

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
spfile                               string      /opt/oracle/product/19c/dbho
```

```bash:LISTENERの起動状況
sh-4.2$ lsnrctl status
# (～省略～)
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
Services Summary...
Service "ORCLCDB" has 1 instance(s).
  Instance "ORCLCDB", status RESTRICTED, has 1 handler(s) for this service...
Service "ORCLCDBXDB" has 1 instance(s).
  Instance "ORCLCDB", status RESTRICTED, has 1 handler(s) for this service...
The command completed successfully
```
↓数分後
```bash:LISTENERの起動状況
h-4.2$ lsnrctl status
# (～省略～)
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=6a6f894672df)(PORT=5500))(Security=(my_wallet_directory=/opt/oracle/admin/ORCLCDB/xdb_wallet))(Presentation=HTTP)(Session=RAW))
Services Summary...
Service "14641d92104b0e8ce063020013ac385d" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
Service "ORCLCDB" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
Service "ORCLCDBXDB" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
Service "orclpdb1" has 1 instance(s).
  Instance "ORCLCDB", status READY, has 1 handler(s) for this service...
The command completed successfully
```