CentOS7上のDockerにOracle19cを構築してみた

コロナ対応で在宅勤務となったので、
今まで興味はあったものの手を出せていなかったDockerを使ってみる。

Dockerのインストールは省略して、
今回はOracle19cでコンテナを構築する手順を紹介。

# 用意するもの
<dl>
<dt>Docker</dt>
<dd>
以下記事を参照。<br>
<a href="https://qiita.com/yoshiyasu1111/items/f2cab116d68ed1a0ce13">LinuxにDockerをインストールする</a>
</dd>
<dt>Oracle19c(本体)</dt>
<dd>
<a href="https://www.oracle.com/database/technologies/oracle-database-software-downloads.html">公式サイト</a>からLinux版をダウンロード。
</dd>
<dt>仮想環境</dt>
<dd>VMWare Workstation15 Player</dd>
<dd>CentOS7（仮想上にある既存の環境を使用）</dd>
</dl>

# 手順
## 1. 仮想マシンの準備
Oracleの要件を満たすスペックが必要。
メモリ3G、HDD100G程度を仮想マシンに割り当て。

## 2. Gitから公式リポジトリをclone
```
git clone https://github.com/oracle/docker-images.git
```
コマンドを実行した場所以下に、`docker-images`ディレクトリができる。

## 3. Oracle19cを仮想OSへコピー
公式よりダウンロードした`LINUX.X64_193000_db_home.zip`をWinSCP等で仮想OS側へコピー。

## 4. Oracle19cを所定のディレクトリへ配置
```
cd ./docker-images/OracleDatabase/SingleInstance/dockerfiles/19.3.0
cp -p /home/aaaa/LINUX.X64_193000_db_home.zip .
```
`aaaa`は各自の環境に合わせて修正。

## 5. コンテナをビルド
```
cd ..
./buildDockerImage.sh -v 19.3.0 -e -i
```
引数の詳細は公式の[Readme](https://github.com/oracle/docker-images/blob/master/OracleDatabase/SingleInstance/README.md)を参照。

`Build completed in xxxx seconds.`の表示が出たらビルド完了。

## 6. 永続化用のディレクトリ用意
```
mkdir /opt/oradata
chmod 777 /opt/oradata
chown 54321:54321 /opt/oradata
```
`/opt/oradata`は各自の環境に合わせて修正。
フルアクセスの権限をつけておく。
所有者はrootでもいけるかもしれないが、念のため`54321`にセットしておく。
*※Docker側の所有者？よくわからん。。。*

マウントポイントなので、ディレクトリ配下は空にしておく。

## 7. Docker runの実行
コマンド実行前にDockerが起動していることを確認。

```
systemctl status docker
```
`Active: inactive (dead)`となっていたらDockerが起動していないので、
以下コマンドを実行してDockerを起動。

```
systemctl start docker
```
<br/>

Dockerが起動したら、docker runを実行してコンテナを作成。

```
docker run --name Oracle19c -p 1521:1521 -p 5500:5500 -e ORACLE_SID=ODB -e ORACLE_PDB=ODB1 -e ORACLE_PWD=oracle -e ORACLE_CHARACTERSET=AL32UTF8 -v /opt/oradata:/opt/oracle/oradata oracle/database:19.3.0-ee
```
| パラメータ | 意味 | 設定値 |
|:-:|:-:|:-:|
|--name|コンテナ名|(例) Oracle19c|
|-p|ポートマッピング<br/>1つ目はOracle Listener<br/>2つ目はOEM Express|1521:1521<br/>5500:5500|
|-e ORACLE_SID|SID|(例)ODB|
|-e ORACLE_PDB|PDB|(例)ODB1|
|-e ORACLE_PWD|システムユーザのパスワード|(例)oracle|
|-v|コンテナ側のデータ領域のマウント先<br/>「:」より前がホスト側のマウントポイント|(例)/opt/oradata|
初回は起動するまで時間がかかった。私の環境だと30分程度。
慌てず待機して`DATABASE IS READY TO USE!`のメッセージが出たら起動完了。

コマンドは実行したままになっているので、別のウィンドウで作業継続。

## 8. 接続確認
```
docker exec -it Oracle19c sqlplus system/oracle@localhost:1521/ODB1
```

SQL*Plusで接続確認して、無事接続できればOK。

```
SQL*Plus: Release 19.0.0.0.0 - Production on Fri Apr 17 05:28:46 2020
Version 19.3.0.0.0

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

Last Successful login time: Thu Apr 16 2020 15:58:14 +00:00

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

SQL> 
```

## 9. ユーザー作成
接続先がPDBであることを確認。

```
SQL> show con_name

CON_NAME
------------------------------
ODB1
SQL>
```
<br/>
CreateUser文を実行。

```
create user testusr
  identified by testpw
  default tablespace USERS
  temporary tablespace TEMP
  quota unlimited on USERS
/
```

<br/>
ユーザができていることを確認。

```
SQL> select username from dba_users where username = 'TESTUSR';

USERNAME
------------------------------------------------------------
TESTUSR

SQL>
```

<br/>
作成したユーザーで接続できることを確認。

```
docker exec -it Oracle19c sqlplus testusr/testpw@localhost:1521/ODB1
```

## 10. イメージの保存
何かあったときに復旧できるように、作成したイメージを保存しておく。

- Dockerイメージの一覧表示（起動中のもの）

```
docker ps
```

```
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS                    PORTS                                            NAMES
f3419fa5e694        oracle/database:19.3.0-ee   "/bin/sh -c 'exec $O…"   15 hours ago        Up 15 minutes (healthy)   0.0.0.0:1521->1521/tcp, 0.0.0.0:5500->5500/tcp   Oracle19c
```

<br/>

- Dockerイメージの保存

```
■イメージのcommit
docker commit f3419fa5e694 oracle19c:ver1

■イメージの保存
docker save oracle19c:ver1 > oracle19c.tar
```

<br/>

- Dockerイメージの読み込み（参考）

```
docker load < ./oracle19c.tar
```

# 参考サイト
今回構築する際に参考にしたサイトです。
ありがとうございました！

- [DockerでOracle Databaseを使う](https://qiita.com/gorilla0513/items/f22e8cce4e08da031abe)
- [公式Docker Imageを利用してOracle Database 19c環境を構築してみた（解決したエラー編）](https://itedge.stars.ne.jp/docker_image_oracle_database_19c_error/)
- [OCI Database(DBaaS) の PDB に sqlplus で接続してみる。(Oracle Cloud Infrastructure)](https://qiita.com/ora_gonsuke777/items/5029e8cb64fbd9fd62ce)