DockerでOracle Databaseを使う

こんにちわ
[グローバスセンス株式会社](https://gb-sense.com)のskanehiraです。

最近コツコツとWebアプリ作っていたので、記事を各のは久々です。
ちなみに作ったWebアプリは[こちら](http://tk2-260-39536.vs.sakura.ne.jp/DelayTrainsInfo/)です。
いずれ、このアプリについて記事を書く予定です。

# **今回のテーマ**
いろいろあって、Oracle Master Bronzeを取得することにしたので、
勉強のため、Oracle Database 12cを用意しました。

その時の備忘録になります。
同じことをやろうとしている方の助けになればと思います。

# **用意するもの**
- Docker
- Docker Compose
- Oracle docker-images（リポジトリ)
- Oracle Database 12c（本体)

Oracle公式でイメージは用意していないため、pullできないので、
イメージをビルドする必要があります。

といっても、公式でちゃんとビルド用のリポジトリが用意されているので大丈夫です。

# ビルド環境
| 環境 | バージョン |
|:-:|:-:|
| OS  | macOS High Sierra  |
| Docker  | 18.03.1-ce  |
|  Docker Compose | version 1.21.1, build 5a3f1a3  |

# **参考サイト**
今回構築する際に参考情報です。
ありがとうございましたm(_ _)m

- https://qiita.com/lethe2211/items/0bb493fa93a0088cfac9
- http://tmegos.hatenablog.jp/entry/docker-oracle-11g
- https://github.com/oracle/docker-images/blob/master/OracleDatabase/SingleInstance/README.md
- https://docs.oracle.com/cd/E39368_01/E75728/html/ch04s18.html

# **手順**
## 1. 公式リポジトリをgit clone

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

いろいろありますが、使用するのは`OracleDatabase`になります。

## 2. 公式からOracle Database本体をダウンロードする
[Oracle Database 12c Release 2 Linux x86-64](http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html)をダウンロードします。

少し時間がかかりますので,
その間はyoutubeでダブステップを聞きながらテンションアゲアゲします。

## 3. ダウンロードしたファイルを配置する
イメージをビルドするのに、本体ファイルをdockerfilesに配置します。

```console
cd docker-images/OracleDatabase/SingleInstance/dockerfiles/12.2.0.1
cp ~/Downloads/linuxx64_12201_database.zip .
```

## 4. ビルド
引数の詳細は[README](https://github.com/oracle/docker-images/blob/master/OracleDatabase/SingleInstance/README.md)を参照してください。

```console
cd ..
./buildDockerImage.sh -v 12.2.0.1 -e -i
```

以下のメッセージが出たら成功です。
マシンスペックにもよりますが、Macbookのパワー不足で20分もかかった…

```console
  Oracle Database Docker Image for 'ee' version 12.2.0.1 is ready to be extended:

    --> oracle/database:12.2.0.1-ee

  Build completed in 1221 seconds.
```

## 5. データ永続化用ディレクトリ
永続化するためのマウントディレクトリを作成しておきます。
権限周りの設定が必要なので、とりあえずフル権限つけておきます。

```console
mkdir ./oradata
chmod 777 ./oradata
```

## 6. yamlファイルを作成

```console
vi docker-compose.yaml
```

中身は以下になります。
使用できる環境変数は[README](https://github.com/oracle/docker-images/blob/master/OracleDatabase/SingleInstance/README.md)を参照してください。

```yaml
version: '2'
services:
  db:
    image: oracle/database:12.2.0.1-ee
    container_name: oracle
    ports:
      - 1521:1521
      - 5500:5500
    volumes:
      - ./oradata:/opt/oracle/oradata
    environment:
      - ORACLE_PWD=Oracle12
      - ORACLE_PDB=oracle
```

## 7. コンテナ作成
ここまで来たら、あとはコンテナを作成するだけです。

```console
docker-compose up -d
```

初回起動は少し時間がかかりますので、
起動できたかどうかをログで確認しましょう。

```console
docker logs -f oracle
```

こんなのが出たらOKです。

```
#########################
DATABASE IS READY TO USE!
#########################
```

`docker ps`の方はこんな感じになります。

```console
[skanehira@MacBook oracle]$ docker ps
CONTAINER ID        IMAGE                         COMMAND                  CREATED             STATUS                 PORTS                                            NAMES
98b74482fc12        oracle/database:12.2.0.1-ee   "/bin/sh -c 'exec $O…"   7 hours ago         Up 2 hours (healthy)   0.0.0.0:1521->1521/tcp, 0.0.0.0:5500->5500/tcp   oracle
[skanehira@MacBook oracle]$
```

## 8. 接続テスト
ローカルにsqplusがないので、コンテナ内で確認してみます。
`docker ps`を見る限りポートマッピングは大丈夫そうなので、内部接続だけ確認します。

```console
[skanehira@MacBook oracle]$ docker exec -it oracle bash
sqlplus SYSTEM/Oracle12@ORCLCDB[oracle@98b74482fc12 ~]$ sqlplus SYSTEM/Oracle12@ORCLCDB

SQL*Plus: Release 12.2.0.1.0 Production on Thu Jun 7 00:43:50 2018

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

Last Successful login time: Wed Jun 06 2018 17:48:20 +00:00

Connected to:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production

SQL>
```
バッチリ！

## 9. imageのexportしておく
何かあった時に、もう一度ビルドするのは面倒なので…
イメージをexportしておきます。

```console
docker export --output="oracle12.2.0.1-ee" oracle
```

# **最後に**
めでたくOracle　Database入ったので、ダブステップを聞きながら勉強します。
しばらく記事は書きませんが、資格取ったら報告も含め記事にする予定です。

では〜