Docker (on Windows) で OracleDB 12.2 イメージをビルドして接続するまで

今回は実際に接続するところまで行います。
[公式Dockerfile](https://github.com/oracle/docker-images/tree/master/OracleDatabase) や参考リンク見た方が速いです :innocent: 

# ※注意
2017年11月7日時点ですと、
Windows10 でコンテナ起動時にボリューム指定すると
`as SYSDBA` でログインできないようです。

https://github.com/oracle/docker-images/issues/525


# 環境
* docker toolbox on Windows 10
* docker-machine.exe version 0.10.0
* `docker version` の結果は以下の通り
* プロキシ設定済
 
```bash:result
 Client:
 Version:      17.03.1-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Mon Mar 27 16:58:30 2017
 OS/Arch:      linux/amd64

Server:
 Version:      17.03.1-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Mon Mar 27 16:58:30 2017
 OS/Arch:      linux/amd64
 Experimental: false
```

# Dockerfile の入手

git 使えない場合は適宜 zip 落として解凍したりしましょう。

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

# Oracle DB 本体の入手

本体は Docker のみで入手できません。
以下のリンクからダウンロードします(事前に無償OTN開発者の登録が必要)。

[Oracle Database Software Downloads | Oracle Technology Network | Oracle](http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html)

上記のリンクから、**(12.2.0.1.0) - Standard Edition 2 and Enterprise Edition**
の **Linux x86-64** 版をダウンロードしましょう(3.2GB もあるので気長に待ちましょう)。

ダウンロードが終わったら **zip ファイルのまま**(ファイル名の例: linuxx64_12201_database.zip)
 `docker-images-master/OracleDatabase/dockerfiles/12.2.0.1` の下に配置します。
`Dockerfile.ee` と同じ場所に zip ファイルがあれば大丈夫です。

# Docker イメージのビルド

以下のようにして Docker image のビルドをします。結構時間がかかります。

```bash
$ cd docker-images-master/OracleDatabase/dockerfiles
$ sh buildDockerImage.sh -v 12.2.0.1 -e
```

各オプションは以下の通りです。
Mac だと MD5 コマンドが無いらしいので `-i` が必要らしいです。

```bash:options
   -v: version to build
       Choose one of: 11.2.0.2  12.1.0.2  12.2.0.1
   -e: creates image based on 'Enterprise Edition'
   -s: creates image based on 'Standard Edition 2'
   -x: creates image based on 'Express Edition'
   -i: ignores the MD5 checksums
   -o: passes on Docker build option
```

#### **注意**

私の環境だと Docker が古かったためか以下の部分でエラーが起きました。

```bash:/OracleDatabase/dockerfiles/12.2.0.1/Dockerfile.ee
～途中省略～
HEALTHCHECK --interval=1m --start-period=5m \
   CMD "$ORACLE_BASE/$CHECK_DB_FILE" >/dev/null || exit 1
```

これはコンテナの異常を検知するためのオプションらしいです。
[Docker 1.12の新機能、ヘルスチェック機能を使ってみる | さくらのナレッジ](https://knowledge.sakura.ad.jp/6754/)

今回はあくまで動かすことが目的なので、コメントアウトして対処しました。
もし同じところで躓いた方は参考にしてください。
（根本的な対処知ってる方いらしたら教えてください :cry: ）

```bash:/OracleDatabase/dockerfiles/12.2.0.1/Dockerfile.ee
～途中省略～
# HEALTHCHECK --interval=1m --start-period=5m \
#    CMD "$ORACLE_BASE/$CHECK_DB_FILE" >/dev/null || exit 1
```

無事に Build が終わると、以下のようにして確認できます。

```bash
$ docker image ls
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
oracle/database                12.2.0.1-ee         5a12cbb3b827        22 hours ago        13.3 GB
```

# コンテナ作成

以下のようにしてコンテナを作成して起動します。
特にポートとか設定していないと接続できないので注意してください。

```bash:startDB.sh
#!/bin/bash
docker run --name oracleDB \
-p 1521:1521 -p 5500:5500 \
-e ORACLE_SID=orcl -e ORACLE_PDB=pdb1 -e ORACLE_PWD=0racleDB \
-v /c/Users/User1/Desktop/studyOracleDB/oradata:/opt/oracle/oradata \
oracle/database:12.2.0.1-ee
```

※ 上記のパスワード「0racleDB」の先頭文字は数字の0です

パスワードは自動で生成されますが、自分で予め設定したい場合は
`-e ORACLE_PWD=<your database passwords>` を入れればできます。
詳しくは [公式Dockerfile](https://github.com/oracle/docker-images/tree/master/OracleDatabase) をご確認ください。

以下のようにしてコンテナを作成&起動します。

```bash
docker@default:/c/Users/User1/Desktop/studyOracleDB$ sh startDB.sh
ORACLE PASSWORD FOR SYS, SYSTEM AND PDBADMIN: 0racleDB

LSNRCTL for Linux: Version 12.2.0.1.0 - Production on 07-NOV-2017 01:24:24

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

~~~省略~~~

#########################
DATABASE IS READY TO USE!
#########################
The following output is now a tail of the alert.log:
Completed: alter pluggable database pdb1 open

~~~省略~~~

Completed:    ALTER PLUGGABLE DATABASE pdb1 SAVE STATE
```

`DATABASE IS READY TO USE!` が出てくれば OK！
さっそく接続していきましょう。

# 起動したコンテナ内の Oracle DB へ接続

ここでは 2通りの方法で接続します。

* ビルドしたイメージ内の sqlplusを使う
* SQL Developer(Windows 版)を使う

## ビルドしたイメージ内の sqlplusを使う

ビルドしたイメージ内に sqlplus が入っているので、それを使います。

```bash
$ docker run --rm -ti oracle/database:12.2.0.1-ee sqlplus system/0racleDB@//192.168.99.100:1521/pd
b1

SQL*Plus: Release 12.2.0.1.0 Production on Tue Nov 7 01:44:07 2017

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


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

SQL> select count(1) from user_tables;

  COUNT(1)
----------
       128

SQL>
```

接続に必要な各パラメータは以下の通りです。

* `0oracleDB` は指定した、もしくは自動生成されたパスワード
* `192.168.99.100:1521` は Docker-machine の ip (`$ docker-machine ls` とかで確認できます)
* `pdb1` はコンテナ起動時に指定したpdb名前 (何も指定しなかった場合は ORCLPDB1 になります)

## SQL Developer(Windows 版)を使う

しかし上記の付属SQL developer だと、接続後に↑↓キーによる履歴参照だったり、
バックスペースキーが使えなかったりしてストレスフルなので、ツールでも接続してみます。
（Docker を Mac や Ubuntu でいれている場合は、lrwrap を入れれば解決できそう？）

まず以下のリンクから Oracle SQL Developer を入手します。
めんどうなので **Windows 64-bit with JDK 8 included** をダウンロードします。

[Oracle SQL Developer ダウンロード](http://www.oracle.com/technetwork/jp/developer-tools/sql-developer/downloads/index.html)

展開して sqldeveloper.exe を開き、左側にある緑のプラスボタンをクリックします。
以下のような入力画面が出てくるので、値を入力しましょう。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/33573/8e85d66c-6338-5e67-dea0-7193f32cc9ea.png)

下にある「テスト」ボタンを押下すれば、接続テストができます。
設定が正しければ、上記の画像のように左下の「ステータス」が「成功」となります。

以下は実際に「接続」を押してから、適当なクエリを投げた結果です。

![image.png](https://qiita-image-store.s3.amazonaws.com/0/33573/13aac01b-8293-0c31-5756-1cdd35005cbc.png)

ちゃんと DB に問い合わせできてますね！
これで自習が捗ります！

# 感想
Oracle DB めんどくちゃい :innocent: 

# 参考リンク
* https://github.com/oracle/docker-images/tree/master/OracleDatabase
* [OS X 10.11で，Oracle Database 12cのDocker Imageを使ってみた - Qiita](https://qiita.com/lethe2211/items/0bb493fa93a0088cfac9)
* [公式 Oracle Database の Docker イメージを構築 - #chiroito ’s blog](http://chiroito.hatenablog.jp/entry/2016/12/28/235627)
* 自分の前回記事: [プロキシ下で OracleDatabase 12.2 の docker image をビルド - Qiita](https://qiita.com/yukkyo1222/items/4c452de583de47d2aa0a)

# 変更履歴
* 2017年11月7日
  * startDB.sh 修正
  * リンクの貼り忘れ対応