DockerコンテナにOracle Database 19c をインストールして、Windows 側から接続

f:id:ts0818:20191117143753j:plain

 シャボン玉が凍る仕組みと「スノードーム効果」と呼ばれる現象の発生原因に関する見識

周囲温度とシャボン玉の温度が同じ場合には、シャボン玉の底部から凍結が始まり、マランゴニ流(表面張力の小さい領域から大きい領域への液体の流れ)が生じ、氷の結晶が凍結前線から剥離して、スノードーム中のフレークのようにシャボン玉の中を浮遊する。その後、氷の結晶が成長し、互いに連結すると、シャボン玉は完全に凍結する。一方、周囲温度が室温である場合には、凍結前線がゆっくりと上方に伝播したが、熱伝導性が悪いために、最終的にはシャボン玉の途中で停止した。この部分的に凍結したシャボン玉はその後、平衡状態を保った後にしぼんで、この液体ドームは崩壊した。

【物理学】シャボン玉が凍る仕組み | Nature Communications | Nature Research

⇧  シャボン玉と言えば、そう、シャボンカッター!

...はい、どうもボクです。 

アルツハイマー病は遺伝するらしいという話を聞いて、日々の睡眠を徐波睡眠となるようにしたいと思ってますが、

scienceportal.jst.go.jp

わずか1滴足らずの血液からアルツハイマー病の早期診断ができる可能性がある診断マーカーを発見した、と名古屋市立大学の研究グループが5日発表した。脳内細胞から出るタンパク質に着目した研究成果で、論文は米医学専門誌に掲載された。研究グループは健康診断などでの実用化を目指して本格的な臨床研究を進めるという。

研究グループは、名古屋市立大学大学院医学研究科の道川誠教授(神経生化学)ら同大学の研究メンバーのほか、大分大学医学部の松原悦朗教授や愛知県にある福祉村病院の橋詰良夫愛知医科大学名誉教授らも加わった。

2019年11月7日ニュース「1滴足らずの血液でアルツハイマー病を早期診断 名古屋市立大研究グループが診断マーカー発見」 | SciencePortal

⇧  アルツハイマー病にも進展がありそうな感じすかね。

 

そんなこんなで、今回は、Dockerコンテナで、Oracle Database が構築できるとの情報がネットにあったので試してみました。

会社のPCは、Windows 10 Proで、Hyper-Vを有効にして、Docker for Windowsの環境でOracle Database 12c 入りのコンテナの構築が上手く言ったので、自宅のPCでも試してみることに。

Windows 10 Home のDocker ToolBoxの環境で、Oracle Database 19c 入りのコンテナの構築を試してみました。

そんでは、レッツトライ~。 

  

DockerコンテナでOracle Database 11g、12c、18c、19c 環境を作れるらしい

通常であれば、Dockerコンテナとして、Oracle Databaseの要件を満たす、ハードディスク(今回は仮想環境なんで、仮想マシンのこと)、OSを用意して、Oracle Databaseをインストールってやんないといけないですと。

ですが、OracleさんがOracle Database入りのDockerコンテナの構築方法を公開してくれてるらしい。 

Oracleさんのプロジェクトで、

github.com

⇧  Docker イメージを公開してるらしい。

んで、

qiita.com

 システム動作検証でOracleが必要だったので、Docker版Oracle Database 12c(12.2.0.1)のインストール手順を残したいと思います
手順としては「Dockerfileからビルドする方法」と「Oracleが提供しているDockerイメージサービスから導入する方法」の2つあります

Docker版Oracle Database 12cを使ってみる - Qiita

⇧  上記サイト様によりますと、方法としては、2通りのやり方があるようです。

今回は、「Dockerfileからビルドする方法」で。 

なので、Docker が使える環境を用意しておきましょう。自分は、Docker ToolBoxとVirtual Boxを使ってます。あとは、Git もインストールしときましょう。

 

構築までの流れ

というわけで、やることとしては、 

  1. Oracle Databaseの要件を満たす仮想マシンの作成
    • メモリ 2GB(2048MB) 以上
    • ディスクサイズ 40GB(40000MB) ぐらいは最低限あったほうが良いかも
  2. Oracleが用意してる、Dockerfileなどコンテナ構築に必要な情報をローカルに落としてくる
  3. Oracle Database のバイナリファイルのzipファイルをローカルに落としてくる
  4. Oracle Database のバイナリファイルのzipファイルを、zipのまま、Dockerfileのあるディレクトリに配置
  5. oracle.envファイルをzipファイルを配置したディレクトリに配置
  6. Dockerfileのあるディレクトリの1つ上の階層にある、buildDockerImage.shを実行で、Docker イメージを作成
  7. Dockerイメージを元に、コンテナを作成

って感じですかね。

コンテナのOSについては、Dockerfileで、base imageとして、「oraclelinux」 が指定されてるので、心配ないかと。違うOSを使いたい場合は、base image を変えれば良いかと。

 

Oracle Database 19c の場合のハードウェア要件は、

docs.oracle.com

⇧  公式によると、メモリは、最低限 2GB は欲しいって言ってますね。

で、ハードディスクサイズについては、

blogs.oracle.com

⇧  上記サイト様によりますと、4GB はあったほうが良いと。ちょっと情報が旧いのが気にはなりますが。

 

実践

1.仮想マシンの作成

そんでは、まずは、Docker ToolBoxで仮想マシンを用意で。 コマンドプロンプトを一応、管理者権限で起動しました。ドライバーが、virtualbox の場合の手順になるので、Virtual Box以外を使ってる場合は、ご自分の環境に合わせてください。

docker-machine create --driver virtualbox --virtualbox-disk-size "40000" --virtualbox-memory "2048" [仮想マシン名]    

f:id:ts0818:20191117155100p:plain

f:id:ts0818:20191117155201p:plain

とりあえず、仮想マシンは用意できました。

 

2.Dockerfileなどコンテナ構築に必要な情報をローカルに落とす 

続きまして、Dockerfileなどをローカルに落とします。git cloneでやろうと思うので、Gitをインストールしときましょう。(普通にzipをダウンロードでも問題ないです。)

zipでダウンロードする場合は、

github.com

⇧  上記のGitHubのページにアクセスして、「Clone or download」から「Download.zip」で大丈夫かと。f:id:ts0818:20191117155731p:plain

自分は、git cloneで落としました。どっちにしろ、落としてきたファイル群を配置するようの適当なディレクトリを作成しときましょう。

f:id:ts0818:20191117160205p:plain

そんでは、git bash を起動(一応、管理者権限で起動してます)して、作成したディレクトリに移動して、git clone で。

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

f:id:ts0818:20191117160700p:plain

f:id:ts0818:20191117160939p:plain

落とせました~。

f:id:ts0818:20191117161101p:plain

 

3.Oracle Databaseのバイナリファイルのzipファイルを入手

そんじゃ、Oracle Databaseのバイナリファイルのzipファイルをダウンロードするのですが、Oracleのアカウントが必要なので登録してない場合は登録しちゃいましょう。

以下にアクセス。

https://www.oracle.com/technetwork/jp/database/enterprise-edition/downloads/index.html

www.oracle.com

「ライセンスに同意する」のラジオボタンにチェックして、

f:id:ts0818:20191117162339p:plain

今回は、「Oracle Database 19c(19.3)」の「Linux x86-64」のZipを選択。

f:id:ts0818:20191117162511p:plain

Oracleにログインしてない場合は、ログインを求められるので、登録したOracleアカウントでログインします。

f:id:ts0818:20191117163250j:plain

ログインが済むと、ダウンロードされます。

f:id:ts0818:20191117163327p:plain

 

4.Oracle Database のバイナリファイルのzipファイルを、zipのまま、Dockerfileのあるディレクトリに配置

ダウンロードしたzipファイルを以下のディレクトリに配置。

自分の場合は、「C:\Users\Toshinobu\Desktop\soft_work\dockerOracle\docker-images\OracleDatabase\SingleInstance\dockerfiles\19.3.0\LINUX.X64_193000_db_home.zip」に配置しました。

Oracle Databaseのバージョンは、19.3.0 です。

ご自分の環境に合わせてください。

f:id:ts0818:20191117164203p:plain

 

4.oracle.envファイルを、zipファイルと同じディレクトリに配置 

そしたらば、GitHubのコンテナ構築の手順には記載が無いんですが、

qiita.com

⇧  上記サイト様によりますと、「oracle.env」を用意して、Oracle Database構築に必要な環境変数を用意しておいたほうが良いということで、zipファイルを配置したディレクトリに「oracle.env」を作成。

f:id:ts0818:20191117165341p:plain

ファイルの中身は、こんな感じ。 (パスワードは、Oracleの基準を満たした方が良いかも。コンテナ構築時に警告もらってしまったので。)

DBT-06208: 入力されたstringパスワードは、Oracle推奨標準に準拠していません。

原因: a.入力するパスワードは、長さを%s文字以上にし、大文字、小文字および数字(0から9)をそれぞれ最低1文字含めることをお薦めします。b. 入力したパスワードは、Oracleがパスワードとしての使用をお薦めしていないキーワードです

処置: 強力なパスワードを指定してください。必要に応じて、Oracleドキュメントのガイドラインを参照してください。*FQN: oracle.assistants.common.resource.AssistantErrorCode.PASSWORD_COMPLEXITY_ERR

DBT-00001からDBT-50002

f:id:ts0818:20191117170013p:plain

保存したら閉じときます。

 

6.Dockerfileのあるディレクトリの1つ上の階層にある、buildDockerImage.shを実行で、Docker イメージを作成

 git bash で、「buildDockerImage.sh」のあるディレクトリに移動して、

sh buildDockerImage.sh -v 19.3.0 -e -i    

f:id:ts0818:20191117173158p:plain

んで、エラー。

f:id:ts0818:20191117173308p:plain

Docker daemon が動いてないって...

どうやら、どのシェルから使うかってのを、Docker daemon に教えてあげないといけないらしい。コマンドプロンプトでやった設定を仮想マシンでも行う。

f:id:ts0818:20191117173431p:plain

で、もう一回、「buildDockerImage.sh」を実行してみる。

今度は処理が進みました。しばらく時間かかります。

f:id:ts0818:20191117174915p:plain

f:id:ts0818:20191117175621p:plain

1160秒ってことは、およそ、20分ぐらいですかね。

イメージができてるか確認。

f:id:ts0818:20191117175805p:plain

⇧  ちゃんと「oracle/database」ってイメージができてますね。

「oraclelinux」のほうは最初に失敗した時にできたやつなので、削除しても問題ないです。

あと、会社のPCで、何回か繰り返し、イメージを作ったりしてると、仮想マシンのディスク容量が足りなくなるのか分からんけど、Tempファイルのほうを使おうとして、足りないってなってエラーになってしまった。

そんな時は、仮想マシンを再作成しました。ディスク領域とか編集したりするほうが良いとは思うんだけど、よく分からんかったので。

そもそも、会社のPCのCドライブが、20GBちょっとしか空きスペースが無くて、Oracle Databaseのインストールすると何もできなくなるというね...

 

 

7.Dockerイメージを元に、コンテナを作成

そんじゃ、コンテナを作成・起動で。自分は、WindowsにインストールしたOracle Database 12c、19c で、ホストのポートの「1521」「1519」を使っているので、ホストのポートを変えてます。

ポートフォワーディングは複数イケるようです。

あと、ゲスト側のディレクトリをマウントするために、ホスト側にディレクトリを作っておきます。

f:id:ts0818:20191117184017p:plain

 

Docker ToolBoxの場合は、マウントの条件があるらしいっす。

yuis-programming.com

⇧  上記サイト様を参考。

 

Dockerfileのある場所まで移動して、コンテナを作成・起動で。

docker run -d --env-file ./oracle.env -v //c/Users/[ユーザ名]/[マウントしたいホストのディレクトリ]:/opt/oracle/oradata -p [ホストのポート]:[ゲストのポート] -p [ホストのポート]:[ゲストのポート] -it --name [コンテナ名] --shm-size="4g" [REPOSITORY]/[TAG]

f:id:ts0818:20191117184544p:plain

 

コンテナの作成が始まります。

ログを表示すると進行状況が分かります。結構時間かかります。

docker logs -f [コンテナ名]

f:id:ts0818:20191117180855p:plain

f:id:ts0818:20191117181632p:plain

f:id:ts0818:20191117182443p:plain

f:id:ts0818:20191117182522p:plain

⇧  とりあえず、「DATABASE IS READY TO USE!」ってメッセージが確認できれば、ログを終了して構わないらしい。
Ctrl + C でログを終了で。

f:id:ts0818:20191117183524p:plain

コンテナの起動確認。

f:id:ts0818:20191117195255p:plain

動いてます。

 

コンテナにログインして、Oracle Databaseに接続してみる

そんじゃ、Oracle Databaseに接続してみましょう。

まずは、コンテナにログイン。Git for Windowsの場合は、winpty って付けないといけないらしい。

f:id:ts0818:20191117195951p:plain

で、Oracle Databaseに接続。

github.com

sqlplus sys/<your password>@//localhost:1521/<your SID> as sysdba
sqlplus system/<your password>@//localhost:1521/<your SID>
sqlplus pdbadmin/<your password>@//localhost:1521/<Your PDB name>

docker-images/OracleDatabase/SingleInstance at master · oracle/docker-images · GitHub

⇧  上記を参考に接続してきます。 

Oracle Database 12c からは、CDBとPDBってデータベースが2つあるので、まずは、CDBに接続。

f:id:ts0818:20191117200157p:plain

つながりました。

接続先もCDBになってます。

f:id:ts0818:20191117200723p:plain

ログアウトして、今度はPDBに接続。

f:id:ts0818:20191117200922p:plain

接続できました。

接続先もPDBになっています。

f:id:ts0818:20191117201010p:plain

 

 

Windows側から接続

コンテナ内から接続できることは分かったので、Windows側、つまりホスト側から接続してみます。

SQL Developerっていう、Oracle Databaseを操作できるGUIツール を使うので、ダウンロードしてない方はダウンロードしちゃいましょう。

www.oracle.com

⇧  自分は、Windows 10 Home を使ってるので、「Windows 64-bit with JDK 8 included」 をダウンロードしました。「バージョン 19.1.0.094.2042」ので大丈夫かと。

で、適当なディレクトリに配置します。で、「sqldeveloper.exe」をダブルクリックで起動。

f:id:ts0818:20191117201937p:plain

そしたら、f:id:ts0818:20191117202145p:plain クリックで、データベース接続のための情報を設定。

f:id:ts0818:20191117202121p:plain

まずは、CDBの接続情報。

項目
ユーザ名(U)  system、または、sys
パスワード(P)  oracle.envで設定したパスワード(ORACLE_PWDの値)
ホスト(A)  仮想マシンIPアドレス
ポート(R)  マウントしたホスト側のポート
SID(I)  oracle.envで設定したSID(ORACLE_SIDの値)

※Docker for Windowsの場合は、localhost でいけます。

設定したら、「テスト(T)」で。ステータスが成功ってなればOK。

f:id:ts0818:20191117202550p:plain

「接続(O)」で。ダイアログが出たら、上記のパスワードを入力で、「OK」。

f:id:ts0818:20191117203311p:plain

接続が追加されてます。

同じように、今度は、PDBの接続情報を追加で。

f:id:ts0818:20191117203445p:plain

PDBの接続情報。

項目
ユーザ名(U)  pdbadmin
パスワード(P)  oracle.envで設定したパスワード(ORACLE_PWDの値)
ホスト名(A)  仮想マシンIPアドレス
ポート(R)  マウントしたホスト側のポート
サービス名(E)  oracle.envで設定したサービス名(ORACLE_PDBの値)

※Docker for Windowsの場合は、localhost でいけます。 

設定したら、「テスト(T)」で。ステータスが成功ってなればOK。

f:id:ts0818:20191117203849p:plain

「接続(O)」で。ダイアログが出たら、上記のパスワードを入力で、「OK」。

f:id:ts0818:20191117203943p:plain

接続が追加されました。

f:id:ts0818:20191117204016p:plain

CDBのほうの中身。

f:id:ts0818:20191117204201p:plain

PDBのほうの中身。

f:id:ts0818:20191117204117p:plain

データベースからログアウトする場合は、対象の接続情報を選択して右クリックで「切断(L)」で。PDBの例。

f:id:ts0818:20191117211229p:plain

切断されました。CDBのほうも同じような手順で「切断(L)」してます。

f:id:ts0818:20191117211405p:plain

 

これで、Oracle Database 19c を使って、Oracle Databaseの学習ができますね。

公式のOracleGitHubの情報だけだと、ORACLE_SIDとか設定されずに、データベースに接続できなくてハマったので、どなたかの参考になれば幸いです。

毎回思うのは、Oracleさんって本当にOracle Databaseを使って欲しいと思っているのか謎ですね。導入しやすくすれば、興味を持つ人が増えるとは思うんですけどね。

Qiitaのcomefigoさんに感謝ですね。

今回はこのへんで。