基本的に Linux な環境で構築する場合 [Oracle Database] 公式Docker Imageを利用してOracle Database 19c環境を構築してみた | | IT Edge Blog https://itedge.stars.ne.jp/docker_image_oracle_database_19c/ と同じなのですが、Windows 10 の場合 image をどのように作るのか?の問題があります。
で、WLS2 で作ったらあっさりできたので、メモ代わりの残しておきます。
19c な Docker Image を作る
Oracle 公式では、12c https://hub.docker.com/_/oracle-database-enterprise-edition までしか用意されていません。結構古いものがのっかったままなので、どうするのかというと、Github にある Oracle の公式手順で作成していきます。
docker-images/OracleDatabase/SingleInstance at main · oracle/docker-images https://github.com/oracle/docker-images/tree/main/OracleDatabase/SingleInstance
ここの手順にしたがって、
$ ./buildContainerImage.sh
してから、
$ docker run –name
すればよいのです。
Linux 環境だと sh があるので、 buildContainerImage.sh が動くのですが、Windows 環境の場合はどうするのか?と言えば、WLS2 を使います。本当は Docker Image をバイナリで出力してくれればいいのですが、このスクリプトはそのまま docker に乗せてしまうので、さて、どうしたものかという感じではあるのですが。
大丈夫。WLS2 とホストな Windows 10(あるいは Windows 11)は内部的にはつながっているので、WLS2 から docker に乗せたもは Windows のほうの docker に乗せられます。というか、Windows のほうが WLS2 の docker を借用するようになっているのかもしれません。
まずは、git clone で oracle/docker-images を丸ごと取得
git clone git@github.com:oracle/docker-images.git
WLS2 を開いて、docker-images/OracleDatabase/SingleInstance/dockerfiles フォルダーへ移動
Oracle 本家から LINUX.X64_193000_db_home.zip をダウンロードして、19.3.0 に置く。zip は解凍せずにそのままでok。
例えば 19.c(19.3.0)で、Enterprise Edition を入れる場合は以下のように指定。
./buildDockerImage.sh -v 19.3.0 -e
これを実行すると、oracle/database の docker image が Windows のほうに追加されます。
コンテナを作る
コンテナを作るのは、Windows のほうで可能です。コマンドラインで次を実行します。
docker run --name oracle19c -p 1521:1521 -p 5500:5500 oracle/database:19.3.0-ee
ホストとなる Windows のほうでは Oracle が入っていないので、ポート番号は 1521 のままにしておきます。ホストとなる Windows のポート番号を変えておきたいときは -p 15210:1521 のようにします。Windows 側で localhost:15210 につなげたときに docker 側で 1521 につながるようになります。
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 INIT_SGA_SIZE=<your database SGA memory in MB> \
-e INIT_PGA_SIZE=<your database PGA memory in MB> \
-e ORACLE_EDITION=<your database edition> \
-e ORACLE_CHARACTERSET=<your character set> \
-e ENABLE_ARCHIVELOG=true \
-v [<host mount point>:]/opt/oracle/oradata \
oracle/database:19.3.0-ee
面倒なので、コンテナを作成したのですが、気を付けるポイントとしては、
- ORACLE_SID のデフォルトが「ORCLCDB」
- ORACLE_PDBのデフォルトが「ORCLPDB1」
- ORACLE_PWDは、コンテナの実行時に自動的に決まります。
sys で接続確認
Windows のほうに sqlplus のクライアントだけを入れておくと、接続確認ができます。
sqlplus sys/siosWOA6SKw=1@localhost:1521/ORCLCDB as sysdba
ログインユーザーと表領域の作成
ログインユーザーを作ってためしておきます。
あとで、.NET から接続確認したいので redmine ユーザーを作ります。
alter session set container=ORCLPDB1;
create tablespace "redminets" datafile '/opt/oracle/oradata/ORCLCDB/redminets.dbf' size 500M
AUTOEXTEND ON NEXT 100M MAXSIZE 1G LOGGING EXTENT MANAGEMENT
LOCAL SEGMENT SPACE MANAGEMENT AUTO;
create user redmine
identified by redmine
default tablespace "redminets"
account unlock ;
GRANT connect TO "REDMINE";
GRANT CREATE SESSION TO "REDMINE";
GRANT "RESOURCE" TO "REDMINE";
ALTER USER "REDMINE" DEFAULT ROLE ALL;
あとは、sqlplus での接続の仕方が違うので、注意しておきましょう。SID とサービス名が初期値で少しややこしくなています。
□docker内で
sqlplus redmine/redmine@orclpdb1
sqlplus redmine/redmine@localhost:1521/ORCLCDB
□windows側から
sqlplus sys/siosWOA6SKw=1@localhost:1521/ORCLCDB as sysdba
sqlplus redmine/redmine@localhost:1521/orclpdb1
lsnrctl status の結果がこちら
メモリに注意
と、ここまで書きましたが、実は docker に oracle database 19c を入れるのはあまりお勧めできません。Oracle 公式が提供している docker images 作成用のスクリプトが非常に多くのメモリを利用する設定しく、コンテナを動かすと 16 GB ほど使われます。
docker stats で調べると 8GB 位つかっています。
こんなに使われると、ホスト側の Windows が死んでしまうので、.wslconfig で制限をします。この加減がよくわからないのですが、まあ、Hyper-V の仮想環境で Windows Server + Oracle を作ったときと同じくらい喰うのはどうなの?って感じです。環境的には、可搬性があるからいいけど。
Docker+WSL2の環境でVmmemのメモリ量が巨大になるのを制限する – いろいろ備忘録日記 https://devlights.hatenablog.com/entry/2021/10/28/073000