Docker で Oracle Database 12c を動かす

# なぜ Docker で動かしたのか
Oracle Database 12c の勉強をしようと思って macOS で動かすにはどうしたらいいのか探していたら。。。

macOS に対応したイメージがない！そして macOS で動かしている方がいらっしゃる！

ということで、検索して出てきたブログを参考にさせていただき、Dockerで動かそうと思い立ちました。（リンクしていいのかわからないので Oracle Database Docker などで検索してください。。）

Docker もよく聞くけど仕事で使ってないし触っておくか！と思ったのでちょうどよかったです。

これやったの去年の10月なので結構前ですね。。記事にするの遅すぎました。。
備忘録として残しておきます。

# 環境
当時の実行環境はこちらでした。
macOS High Sierra 10.13.6
メモリ 8GB

そしてかかった時間は120分以上。長かったです。

# 準備
私が実施した手順を実行するには、
Docker を動かす環境を作り、

- Oracle
- GitHub

上記のアカウントを作成しておくとスムーズです。

# ダウンロードするもの
## Oracle
[Oracle Database ソフトウェア・ダウンロード](https://www.oracle.com/technetwork/jp/database/bi-datawarehousing/downloads/index.html)から、バイナリファイルをダウンロードします。
今回は *(12.1.0.2.0) - Standard Edition (SE2)* の *Linux x86-64* を選択します。File 1, File 2 の両方をダウンロードします。

そして [Oracle SQL Developer](https://www.oracle.com/technetwork/jp/developer-tools/sql-developer/downloads/index.html)で動かすため、こちらもダウンロードしておきます。

## GitHub
Oracle が Docker イメージを作成するスクリプト群を GitHub 上に公開しているので、[oracle/docker-images](https://github.com/oracle/docker-images) より「Clone or download」 を実施します。私は git clone して持ってきました。

```
$ git clone https://github.com/oracle/docker-images.git
```

# 手順
参考ページを見ながら動かしてみました！
参考ページは Enterprise Edition でしたが、私は Standard Edition 2 なのでそこだけ注意します。

## ディレクトリの作成
GitHub から Clone してくるだけだと、どうやらディレクトリが足りない・・・？
と思ったらドキュメントが古かった。。
GitHub が更新されてディレクトリ構造が変わってました。（去年なのでもう直ってるかも）

```
/docker-images/OracleDatabase/SingleInstance/dockerfiles/12.1.0.2/
```

ここに Oracle からダウンロードした zip ファイルを配置します。

## コマンドの実行
zip ファイルを配置したディレクトリから一つ上の階層に移動してコマンドを実行します。
Standard Edition なのでオプションに `-s` を使用します。

```
$ ./buildDockerImage.sh -v 12.1.0.2 -s
```

このコマンドを実行すると諸々ダウンロードが始まります。24ステップくらいあって長かった記憶。

ダウンロード完了後は以下のコマンドを実行します。

```
$ docker run --name orcl -p 1521:1521 -p 5500:5500 -v /Users/XXXXX/develop/docker/oracle-database/12c/oradata:/opt/oracle/oradata \
> -e ORACLE_SID=orcl -e ORACLE_PDB=pdb1 oracle/database:12.1.0.2-se2
```

このコマンドで失敗した場合は、

```
$ docker container ls -a
```

上記のコマンドを実行して NAME が `orcl` のコンテナがあることを確認し、

```
$ docker rm orcl
```

さらに上記コマンドでコンテナを消してから再実行してください。
成功すると以下のようにログが出力されます。
一行目の最後にパスワードが出力されているので忘れないよう注意！
また、

```
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
```

上記に SQL Developer で設定するホストとポートが出力されているのでこちらも忘れないよう注意してください。

```
ORACLE PASSWORD FOR SYS, SYSTEM AND PDBADMIN: {password}

LSNRCTL for Linux: Version 12.1.0.2.0 - Production on 07-OCT-2018 10:45:00

Copyright (c) 1991, 2014, Oracle.  All rights reserved.

Starting /opt/oracle/product/12.1.0.2/dbhome_1/bin/tnslsnr: please wait...

TNSLSNR for Linux: Version 12.1.0.2.0 - Production
System parameter file is /opt/oracle/product/12.1.0.2/dbhome_1/network/admin/listener.ora
Log messages written to /opt/oracle/diag/tnslsnr/5b1f3208ff47/listener/alert/log.xml
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))

Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=EXTPROC1)))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 12.1.0.2.0 - Production
Start Date                07-OCT-2018 10:45:00
Uptime                    0 days 0 hr. 0 min. 0 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /opt/oracle/product/12.1.0.2/dbhome_1/network/admin/listener.ora
Listener Log File         /opt/oracle/diag/tnslsnr/5b1f3208ff47/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=0.0.0.0)(PORT=1521)))
The listener supports no services
The command completed successfully
Copying database files
1% complete
2% complete
27% complete
Creating and starting Oracle instance
29% complete
32% complete
33% complete
34% complete
38% complete
42% complete
43% complete
45% complete
Completing Database Creation
48% complete
51% complete
53% complete
62% complete
64% complete
72% complete
Creating Pluggable Databases
78% complete
100% complete
Look at the log file "/opt/oracle/cfgtoollogs/dbca/ORCL/ORCL.log" for further details.

SQL*Plus: Release 12.1.0.2.0 Production on Sun Oct 7 11:11:12 2018

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


Connected to:
Oracle Database 12c Standard Edition Release 12.1.0.2.0 - 64bit Production

SQL> 
System altered.

SQL> 
Pluggable database altered.

SQL> Disconnected from Oracle Database 12c Standard Edition Release 12.1.0.2.0 - 64bit Production
The Oracle base remains unchanged with value /opt/oracle
#########################
DATABASE IS READY TO USE!
#########################
The following output is now a tail of the alert.log:
Sun Oct 07 11:10:57 2018

XDB initialized.
Sun Oct 07 11:11:09 2018
Thread 1 advanced to log sequence 12 (LGWR switch)
  Current log# 3 seq# 12 mem# 0: /opt/oracle/oradata/ORCL/redo03.log
Sun Oct 07 11:11:12 2018
ALTER SYSTEM SET control_files='/opt/oracle/oradata/ORCL/control01.ctl' SCOPE=SPFILE;
   ALTER PLUGGABLE DATABASE PDB1 SAVE STATE
Completed:    ALTER PLUGGABLE DATABASE PDB1 SAVE STATE
Sun Oct 07 11:19:27 2018
Warning: VKTM detected a time drift.
Time drifts can result in an unexpected behavior such as time-outs. Please check trace file for more details.
```

これで Docker にイメージが作成され、接続準備が完了しました。

止めるときは以下のコマンドを実行します。

```
$ docker stop orcl
```

再度動かしたいときは以下のコマンドを実行します。

```
$ docker start orcl
```

# SQL Developer の設定
![スクリーンショット 2019-12-01 15.30.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/254040/5da6ce80-4328-1e49-c8f3-f3a993f5d97b.png)

Docker で動かしている状態で SQL Developer に設定してあげると接続できます。

# 最後に
去年やったことの備忘録なので、少し変わっている箇所はあるかもしれません。
その場合は適宜読み替えていただければと思います。

もし間違っている箇所などございましたらご指摘ください。