WSL2を介したDocker DesktopでOracle12を動かすまで

2020年10月2日

例の如く、いろいろとハマりまくりながらDocker DesktopでOracle12を動かすところまでやりました。今回の目標は以下です。
①Dockerコンテナー内からsqlplusで接続確認(ホスト端末にsqlplusがないから)
②A5sqlで接続確認(ホスト端末にsqlplusがないからその代わりに)

ちなみに、前回の記事でWindows HomeにDocker Desktopを導入するためにWSL2を入れたりしました。

というわけで、以下を参考にさせてもらいつつやっていきました。

https://qiita.com/comefigo/items/d05c0e1977cc25e6b98a

daemon.jsonを変更しないといけないのに見つからない

一発目のハマりポイントはこれでした。

ググっているとこちらが見つかりました。
%userprofile%\.docker\daemon.json
確かにあった!
他にもパラメータがありましたが、それらはとりあえず無視。
必要な設定を追記します。
※以下のようにしたら
This error may also indicate that the docker daemon is not running.
というエラーが出たのでやり方が違うっぽい。

最後のほうでdaemon.jsonの設定でハマった経緯とかを説明しますが、設定すべき値は
"storage-opt": ["dm.basesize=20G"]
でした。

OracleのDocker-imagesをGitリポジトリからクローンしてくる

git cloneする

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

OTNでOracle Database 12c Release 2をダウンロード

Linux版でいいのかな?
公式を見ると、Linux x86-64を使うようにと書いてありました。

make sure you use the linux link: Linux x86-64.

https://www.oracle.com/database/technologies/oracle-database-software-downloads.html

上記ファイルを cloneしたリポジトリのOracleDatabase/SingleInstance/dockerfiles/12.2.0.1/
に配置 する。

この配置についてですが、ダウンロードしたものか、それとも解凍したものを配置するのかどうかわからなかったのですが、Dockerfileを見てみるとzipのままで良さそうでした。
なのでそのまま配置。
こちらもReadMeに解凍せずにと書いてありました。

Note that you must not uncompress the binaries. The script will handle that for you and fail if you uncompress them manually!

起動用の環境変数ファイル(oracle.env)をOracleDatabase/SingleInstance/dockerfiles/12.2.0.1/にoracle.envを作成

以下のような内容で作りました。
こちらはsqlplus,A5sqlの接続の際に使います。

TZ=Asia/Tokyo
ORACLE_SID=SID
ORACLE_PDB=PDB
ORACLE_PWD=oracle
ORACLE_CHARACTERSET=AL32UTF8

buildDockerImage.shを使ったDockerイメージ作成

ちょっと参考にしていた手順と違うけど、以下で書かれていることをやっていく。

https://github.com/oracle/docker-images/tree/master/OracleDatabase/SingleInstance

というのも、参考ページで進めたものだとsqlplusが入ってなかったりしたので、色々手動で入れていく必要があるかな?というのを感じだったため。
初めはそちらでやってましたが(その記録は最後のほうで書いてます)
というわけで、buildDockerImage.shを使ってやってみる。

buildDockerImage.sh について

buildDockerImage.sh スクリプトは MD5 チェックを行うユーティリティシェルスクリプトで、初心者が簡単に始められる方法です。上級者の方は、お好みのパラメータを設定して直接docker buildを呼び出すことができます。

使用方法: buildDockerImage.sh -v [バージョン] [-e | -s | -x] [-i] [-o] [Dockerビルドオプション]
Oracle Database用のDockerイメージを構築します。

パラメータ
-v: ビルドするバージョン
のいずれかを選択してください。11.2.0.2 12.1.0.2 12.2.0.1 18.3.0 18.4.0 19.3.0
-e: ‘Enterprise Edition’ ベースのイメージを作成します。
-s: ‘Standard Edition 2’ に基づいて イメージ を作成します。
-x: ‘Express Edition’ に基づいて イメージ を作成します。
-i: MD5チェックサムを無視します。
-o: Dockerビルドオプションを渡す

  • e, -s, -x のいずれか1つのエディションのみを選択してください。

今回は、 Oracle Database 12c を使いたい。
こちらのHow to build and runを確認すると、 Enterprise Edition and Standard Edition 2 と書いてあるので、上記パラメータは-eとすることにした。

Oracle Database 12c Release 2 (12.2.0.2) Enterprise Edition and Standard Edition 2

以下コマンドを実行するようです。

buildDockerImage.sh -v 12.2.0.1 -e -i
では、どうやってこちらのコマンドを実行するのか。
私はVSCodeのターミナルを使いました。

VSCodeのターミナルでwslを起動してImageをビルドする

まずはPowerShellでwslを起動しました。

wlsと打ち込めば選択したUbuntuが立ち上がります。


しかし、なんか文字化けするので、やっぱりVSCodeのターミナル使うことにします。

VSCodeのターミナルを選択して、wslと打ち込む。
結局やってることはPowerShellと一緒ですね。

既にOTNでOracle Database 12c Release 2をダウンロード して配置しているので、buildDockerImage.shを実行します。
buildDockerImage.sh -v 12.2.0.1 -e -i

こちらを実行するとDocker Imageが作成されます。

docker run -d --env-file ./oracle.env -p 1521:1521 -p 5500:5500 -it --name my_oracle --shm-size="4g" oracle/database:12.2.0.1-ee
docker exec -it oracle bash
sqlplus

これでとりあえず繋がることを確認しました。

以下は、oracle.envで起動したコンテナーに合うようにsqlplusを投げる。

sqlplus sys/oracle@//localhost:1521/SID as sysdba

A5SQLでも同様にして接続できることを確認しました。

次回の話

ハマったところの記録メモ

daemon.jsonの設定

まず、cdでDockerfileが置いてあるディレクトリまで移動する。
そこで以下のコマンドを実行する。
docker build -t oracle/database:12.2.0.1-se2 .
はい、エラーでました。

再起動したからDockerが起動してないのか?
怪しい一文はこちら。
This error may also indicate that the docker daemon is not running.
これをそのままググってみます。

調査の結果、どうやら自動でDockerがスタートしていないようだ。

書いてある通りにDockerをスタートしようとすると

ほんっとうまくいくほうが珍しい。
daemon.jsonの設定が悪かったのかな?
エラーを読んでみたけど、まったく見当がつかない。

daemon.json の設定とあたりを付けて、設定を戻すことにした。
もともとは以下のような感じでしたね。

{
  "registry-mirrors": [],
  "insecure-registries": [],
  "debug": true,
  "experimental": false
}

設定をもとに戻して再起動してみると
エラーが出ずに立ち上がっていることがわかる。

Dockerの再起動方法をさぐる

ちょっとググってみると、こちらが見つかり、 設定反映の流れが書いてあるので、その流れに沿わないと反映されないのかもしれない。

以下daemon.jsonを反映させるときに使うコマンドの抜粋
daemon.jsonを変更するのに起動順序が重要になってくるってこと?

systemctl stop docker     # dockerを止めて
rm -rf /var/lib/docker    # コンテナやキャッシュを全部削除して
systemctl daemon-reload   # 設定を再読み込みして
systemctl start docker    # dockerを起動
powershellでやってみるが、エラーになった。

ubuntu.exeならうまくいくのか?

んあー、わからんっすよ。。。
この手探り感、酒のつまみとしては抜群に合う。
けども、わからん。

あ、わかった。
systemctlってcentOSのコマンドでっしゃろ!
以下キーワードでググってみる

stop docker ubuntu

公式のドキュメントに書いてあったかもしれん。

もう一度daemon.json に
"storage-opts": ["dm.basesize=20G"]
追記してやってみます。

ごっつい景気悪いやん
WSL2のubuntu.exeでdocker認識してないってどういうことなんだ。

っで、上記状態で一晩寝かせました。

上記の参考エントリで書いてあるように順序が重要なんだろうけど
そもそもdockerを止めれないので、まずは止めるところを頑張って調査。
結局、GUIでDockerを再起動できるということがわかった。

あと、設定もここから変えてみようかな。
Settingsを開いて、まず初期状態に戻す。
つまり"storage-opts": ["dm.basesize=20G"]の部分を一度消してリスタートしてみる。

settings→Docker Engineを開くと、daemonファイル

中身を修正すると

configurationで公式のドキュメントを読んでいると気づいてしまった。 “storage-opts”: [“dm.basesize=20G”] ←間違い
“storage-opt”: [“dm.basesize=20G”] ←正しい
どうやらoptsではないらしい。
設定を修正すると正しくDockerが起動しました。

再度イメージのビルド

cdでDockerfileが置いてあるディレクトリまで移動する。
そこで以下のコマンドを実行する。
docker build -t oracle/database:12.2.0.1-se2 .
やっとイメージをビルドすることができました。

起動

docker run -d --env-file ./oracle.env -p 1521:1521 -p 5500:5500 -it --name my_oracle --shm-size="4g" oracle/database:12.2.0.1-se2

エラーでたー

docker imagesしてみて確認
恐らくSIZEが4.01GBのものがrunしたかった対象のイメージのはず。
ただ、REPOSITORYが<none>になっているので指定した名称でrunできなかったのかも?
そもそもこの<none>がなぜ作られたのかとだけど、たぶんdockerの設定で storage-opt を設定していないままBuildしてエラーが出た時のものかなと思います。残骸が残ってるのかな?CREATEDの時間を見る限りそれしか考えられない。

docker runのパラメータについて

docker run --name <container name> \
-p <host port>:1521 -p <host port>:5500 \
-e ORACLE_SID=<your SID> \
-e ORACLE_PDB=<your PDB name> \
-e ORACLE_PWD=<your database passwords> \
-e ORACLE_EDITION=<your database edition> \
-e ORACLE_CHARACTERSET=<your character set> \
-v [<host mount point>:]/opt/oracle/oradata \
oracle/database:19.3.0-ee

Parameters:
   --name:        The name of the container (default: auto generated)
   -p:            The port mapping of the host port to the container port. 
                  Two ports are exposed: 1521 (Oracle Listener), 5500 (OEM Express)
   -e ORACLE_SID: The Oracle Database SID that should be used (default: ORCLCDB)
   -e ORACLE_PDB: The Oracle Database PDB name that should be used (default: ORCLPDB1)
   -e ORACLE_PWD: The Oracle Database SYS, SYSTEM and PDB_ADMIN password (default: auto generated)
   -e ORACLE_EDITION:
                  The Oracle Database Edition (enterprise/standard).
                  Supported 19.3 onwards.
   -e ORACLE_CHARACTERSET:
                  The character set to use when creating the database (default: AL32UTF8)
   -v /opt/oracle/oradata
                  The data volume to use for the database.
                  Has to be writable by the Unix "oracle" (uid: 54321) user inside the container!
                  If omitted the database will not be persisted over container recreation.
   -v /opt/oracle/scripts/startup | /docker-entrypoint-initdb.d/startup
                  Optional: A volume with custom scripts to be run after database startup.
                  For further details see the "Running scripts after setup and on startup" section below.
   -v /opt/oracle/scripts/setup | /docker-entrypoint-initdb.d/setup
                  Optional: A volume with custom scripts to be run after database setup.
                  For further details see the "Running scripts after setup and on startup" section below.

docker rmiで不要なイメージを削除

ともかく、それら残骸をすべて消すことにする。
docker rmi IMAGEID
これを実行していく。

imageのリポジトリ名とタグ名を変更する

docker tag イメージID リポジトリ名:タグ名

docker tag b24b540a4e10 myora

変更されたことを確認した。

再度run

REPOSITORYを変更したので、一番最後の
oracle/database:12.2.0.1-se2
この部分を以下に変更
myora

docker run -d --env-file ./oracle.env -p 1521:1521 -p 5500:5500 -it --name my_oracle --shm-size="4g" myora

docker psで確認

メモ

ボリュームのマウントは以下をみてやっていく予定。

https://qiita.com/kawakawaryuryu/items/ae51bee866a57f178fe5